原题:
BFS入门题,打印路径记录前驱就可以了。然后可以递归打印,也可以非递归打印路径:
递归打印路径:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>using namespace std;int maze[6][6];
int vis[6][6], dist[6][6];
int dr[] = { -1,1,0,0 };
int dc[] = { 0,0,1,-1 };struct node
{int r, c;
}pre[6][6];
queue<node>Q;
void bfs()
{while (!Q.empty())Q.pop();memset(vis, 0, sizeof(vis));dist[0][0] = 0;node tmp;tmp.c = tmp.r = 0;Q.push(tmp);while (Q.size()){node tmp = Q.front(); Q.pop();int r = tmp.r, c = tmp.c;for (int i = 0; i < 4; i++){int nr = r + dr[i], nc = c + dc[i];if (nr >= 0 && nr <= 4 && nc >= 0 && nc <= 4 && !vis[nr][nc] && maze[nr][nc] == 0){vis[nr][nc] = 1;tmp.c = nc;tmp.r = nr;Q.push(tmp);dist[nr][nc] = dist[r][c] + 1;tmp.r = r; tmp.c = c; pre[nr][nc] = tmp; //丫丫的,好不方便~可是我不会C++呀。if (nr == 4 && nc == 4)return;}}}
}
void print(int x, int y) //递归打印
{if (x == 0 && y == 0)return;print(pre[x][y].r, pre[x][y].c);printf("(%d, %d)\n", pre[x][y].r, pre[x][y].c);
}
int main()
{for(int i=0;i<5;i++)for (int j = 0; j < 5; j++)cin >> maze[i][j];bfs(); print(4, 4);cout << "(4, 4)" << endl;system("pause");
}
非递归:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>using namespace std;int maze[6][6];
int vis[6][6], dist[6][6];
int dr[] = { -1,1,0,0 };
int dc[] = { 0,0,1,-1 };struct node
{int r, c;
}pre[6][6];
queue<node>Q;
void bfs()
{while (!Q.empty())Q.pop();memset(vis, 0, sizeof(vis));dist[0][0] = 0;node tmp;tmp.c = tmp.r = 0;Q.push(tmp);while (Q.size()){node tmp = Q.front(); Q.pop();int r = tmp.r, c = tmp.c;for (int i = 0; i < 4; i++){int nr = r + dr[i], nc = c + dc[i];if (nr >= 0 && nr <= 4 && nc >= 0 && nc <= 4 && !vis[nr][nc] && maze[nr][nc] == 0){vis[nr][nc] = 1;tmp.c = nc;tmp.r = nr;Q.push(tmp);dist[nr][nc] = dist[r][c] + 1;tmp.r = r; tmp.c = c; pre[nr][nc] = tmp; //丫丫的,好不方便~可是我不会C++呀。if (nr == 4 && nc == 4)return;}}}
}
int main()
{for(int i=0;i<5;i++)for (int j = 0; j < 5; j++)cin >> maze[i][j];bfs(); stack<node>S;int cur_r = 4, cur_c = 4;while (1){node tmp;tmp.r = cur_r;tmp.c = cur_c;S.push(tmp);if (cur_r == 0 && cur_c == 0)break;int r = cur_r, c = cur_c;cur_r = pre[r][c].r;cur_c = pre[r][c].c;}while (S.size()){node tmp = S.top(); S.pop();printf("(%d, %d)\n", tmp.r, tmp.c);}system("pause");
}