迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 30005 | Accepted: 17243 |
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct node{
int x,y;
int temp;
};
node list[100][100];//保存路径
int a[6][6];
int f[2][2]={0,1,1,0};
int vis[6][6];
void bfs()
{
node s,t;
queue<node>q;
vis[0][0]=1;
s.x=0;
s.y=0;
s.temp=0;
q.push(s);
while(!q.empty())
{
t=q.front();
q.pop();
if(t.x==4&&t.y==4)
{
return ;
}
for(int i=0;i<2;i++)
{
s.x=t.x+f[i][0];
s.y=t.y+f[i][1];
s.temp=t.temp+1;
if(s.x<0||s.y<0||s.x>=5||s.y>=5||vis[s.x][s.y]||a[s.x][s.y])
continue;
vis[s.x ][s.y ]=1;
list[s.x][s.y].x=t.x;//保存上一个坐标
list[s.x][s.y].y=t.y;
q.push(s);
}
}
}
void print(int sx,int sy)//倒序输出
{
if(sx==0&&sy==0)
{//输出起点
printf("(%d, %d)\n",sx,sy);
return;
}
print(list[sx][sy].x,list[sx][sy].y);
printf("(%d, %d)\n",sx,sy);//输出路径
}
int main()
{
memset(vis,0,sizeof(vis));
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
scanf("%d",&a[i][j]);
}
bfs();
print(4,4);//打印路径
return 0;
}