迷宫问题
Description
定义一个二维数组:
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 Sample Output (0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4) Source |
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 10;
int maze[maxn][maxn];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
struct Node
{
int x,y;
}fa[maxn][maxn];
void bfs()
{
queue <Node> que;
while(!que.empty()) que.pop();
Node pre,cur;
pre.x = 0;
pre.y = 0;
que.push(pre);
maze[0][0] = 1;
while(!que.empty())
{
pre = que.front();
que.pop();
if(pre.x == 4 && pre.y == 4)
return;
for(int i = 0; i < 4; i++)
{
int x = pre.x + dir[i][0];
int y = pre.y + dir[i][1];
if(x < 0 || x >= 5 || y < 0 || y >= 5)
continue;
if(!maze[x][y])
{
maze[x][y] = 1;
fa[x][y].x = pre.x;
fa[x][y].y = pre.y;
cur.x = x;
cur.y = y;
que.push(cur);
}
}
}
}
int main()
{
memset(fa,0,sizeof(fa));
memset(maze,0,sizeof(maze));
for(int i = 0; i < 5; i++)
for(int j = 0; j < 5; j++)
scanf("%d", &maze[i][j]);
bfs();
stack <Node> S;
Node node;
node.x = 4;
node.y = 4;
S.push(node);
while(node.x || node.y)
{
int x = node.x;
int y = node.y;
node.x = fa[x][y].x;
node.y = fa[x][y].y;
S.push(node);
}
while(!S.empty())
{
node = S.top();
printf("(%d, %d)\n", node.x, node.y);
S.pop();
}
return 0;
}