| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 71133 | sh25_zhoumy | 黑白精灵 | C++ | 解答错误 | 0 MS | 248 KB | 2882 | 2025-10-24 15:07:26 |
#include <iostream> #include <vector> #include <queue> #include <algorithm> #include <climits> using namespace std; struct Point { int x, y; int steps; }; int bfs(int startX, int startY, int endX, int endY, int N, int M, const vector<vector<bool>>& visited = vector<vector<bool>>()) { vector<vector<bool>> localVisited; if (visited.empty()) { localVisited = vector<vector<bool>>(N + 1, vector<bool>(M + 1, false)); } else { localVisited = visited; } int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; queue<Point> q; q.push({startX, startY, 0}); localVisited[startX][startY] = true; while (!q.empty()) { Point p = q.front(); q.pop(); if (p.x == endX && p.y == endY) { return p.steps; } for (int i = 0; i < 4; ++i) { int nx = p.x + dx[i]; int ny = p.y + dy[i]; if (nx >= 1 && nx <= N && ny >= 1 && ny <= M && !localVisited[nx][ny]) { q.push({nx, ny, p.steps + 1}); localVisited[nx][ny] = true; } } } return INT_MAX; } int main() { int N, M; cin >> N >> M; int N1, M1; cin >> N1 >> M1; int N2, M2; cin >> N2 >> M2; // 情况1:不使用穿越门 int case1 = bfs(1, 1, N, M, N, M); // 情况2:使用穿越门(从起点到门1,然后从门2到终点) vector<vector<bool>> visited(N + 1, vector<bool>(M + 1, false)); int steps_to_door1 = bfs(1, 1, N1, M1, N, M, visited); if (steps_to_door1 != INT_MAX) { // 重置visited数组,从门2开始搜索 vector<vector<bool>> visited2(N + 1, vector<bool>(M + 1, false)); visited2[N2][M2] = true; // 门2位置已访问 int steps_from_door2 = bfs(N2, M2, N, M, N, M, visited2); if (steps_from_door2 != INT_MAX) { int case2 = steps_to_door1 + steps_from_door2; cout << min(case1, case2) << endl; return 0; } } // 情况3:使用穿越门(从起点到门2,然后从门1到终点) vector<vector<bool>> visited3(N + 1, vector<bool>(M + 1, false)); int steps_to_door2 = bfs(1, 1, N2, M2, N, M, visited3); if (steps_to_door2 != INT_MAX) { vector<vector<bool>> visited4(N + 1, vector<bool>(M + 1, false)); visited4[N1][M1] = true; int steps_from_door1 = bfs(N1, M1, N, M, N, M, visited4); if (steps_from_door1 != INT_MAX) { int case3 = steps_to_door2 + steps_from_door1; cout << min(case1, case3) << endl; return 0; } } cout << case1 << endl; return 0; }