解題心得
也是中規中矩的bfs(?
記得清空,以及題目input的座標是從1開始。
程式碼
#include <iostream> #include <queue> using namespace std; struct Point { int x, y, step = -1; }; char map[101][101] = { 0 }; bool isVisited[101][101] = { false }; int main() { int N, n, m; Point start, end, now; cin >> N; while (N--) { cin >> n >> m >> start.x >> start.y >> end.x >> end.y; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) cin >> map[i][j]; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) isVisited[i][j] = false; start.x -= 1; start.y -= 1; end.x -= 1; end.y -= 1; //bfs queue<Point> q; isVisited[start.x][start.y] = true; start.step = 1; bool isValid = false; q.push(start); while (!q.empty()) { now = q.front(); q.pop(); //cout << now.x << " " << now.y << " " << now.step << endl; if (now.x == end.x && now.y == end.y) { cout << now.step << endl; isValid = true; break; } if (now.x - 1 >= 0 && map[now.x - 1][now.y] == '0' && !isVisited[now.x - 1][now.y]) { Point p; p.x = now.x - 1; p.y = now.y; isVisited[now.x - 1][now.y] = true; p.step = now.step + 1; q.push(p); } if (now.x + 1 < n && map[now.x + 1][now.y] == '0' && !isVisited[now.x + 1][now.y]) { Point p; p.x = now.x + 1; p.y = now.y; isVisited[now.x + 1][now.y] = true; p.step = now.step + 1; q.push(p); } if (now.y - 1 >= 0 && map[now.x][now.y - 1] == '0' && !isVisited[now.x][now.y - 1]) { Point p; p.x = now.x; p.y = now.y - 1; isVisited[now.x][now.y - 1] = true; p.step = now.step + 1; q.push(p); } if (now.y + 1 < m && map[now.x][now.y + 1] == '0' && !isVisited[now.x][now.y + 1]) { Point p; p.x = now.x; p.y = now.y + 1; isVisited[now.x][now.y + 1] = true; p.step = now.step + 1; q.push(p); } isVisited[now.x][now.y] = true; } if (!isValid) cout << 0 << endl; } return 0; }
沒有留言:
張貼留言