#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
struct Node {
int x, y;
Node() {}
Node(int x, int y):x(x), y(y) {}//这里就是简单的初始化属性,方便操作
};
int maze[5][5];
int pathx[5][5], pathy[5][5];
bool vis[5][5];
int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
void bfs() { /*因为搜索最短路径且已知最短路径的走向所以起始位置已知且暴力搜索不会超时果断bfs */
queue<Node> Q;
Q.push(Node(0, 0)); /*依稀记得柴哥讲的小技巧在结构体里直接在构造函数初始化当前点的x,y */
vis[0][0] = 1;
while (!Q.empty()) {
Node t = Q.front();
Q.pop();
for (int i = 0; i < 4; i++) { /*广度搜索规则是将临近的点搜索完按照先进先出此前添加到队列的点的顺序再次扫描 */
int x = t.x + dir[i][0];
int y = t.y + dir[i][1];
if (x < 0 || x >= 5 || y < 0 || y >= 5 || vis[x][y] || maze[x][y]) //这里只要控制在5*5的格子内即可
continue;
pathx[x][y] = t.x; //打印路径因此保存
pathy[x][y] = t.y; /这里直接按照输出的打印路径将坐标保存在路径上 */
vis[x][y] = 1;
Q.push(Node(x, y));
}
}
}
void print(int x, int y) {
if (x == 0 && y == 0) {
printf("(%d, %d)\n", x, y);
return ;
}
print(pathx[x][y], pathy[x][y]); /*这里就是将要输出的路径保存在路径上的原因像一个递归一样从终点逆向回到起点并将路径打印出来 */
printf("(%d, %d)\n", x, y);
}
int main() {//此题反应了半天发现只有5*5的大小
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
scanf("%d" ,&maze[i][j]);
memset(vis, 0, sizeof(vis));
bfs();
print(4, 4);
return 0;
}
poj 3984
最新推荐文章于 2022-11-30 17:26:01 发布