很簡單的寬搜問題,打印路徑的時候須要遞歸。數組
代碼用了數組表示上下左右,可是易讀性降低了挺多。spa
#include <cstdio> #include <queue> #include <cstring> using namespace std; int maze[10][10]; int vis[30]; int prex[30], prey[30]; int delta[][2] = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } }; void printpath(int x, int y) { if(x || y) printpath(prex[x*5+y], prey[x*5+y]); printf("(%d, %d)\n", x, y); } queue<int> q; void bfs() { q.push(0*5+0); vis[0*5+0] = 1; prex[0*5+0] = 0; prey[0*5+0] = 0; while(!q.empty()) { int a = q.front(); q.pop(); int x = a / 5, y = a % 5; if(x == 4 && y == 4) break; for(int i = 0; i < 4; i++) { int _x = x + delta[i][0]; int _y = y + delta[i][1]; if(_x >= 0 && _x < 5 && _y >= 0 && _y < 5 && !maze[_x][_y] && !vis[_x*5+_y]) { q.push(_x*5+_y); vis[_x*5+_y] = 1; prex[_x*5+_y] = x; prey[_x*5+_y] = y; } } } printpath(4, 4); } int main() { for(int i = 0; i < 5; i++) for(int j = 0; j < 5; j++) scanf("%d", &maze[i][j]); bfs(); return 0; }