迷宫问题
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Submit Status Practice POJ 3984
System Crawler (2014-09-11)
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)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int map[10][10];
int v[100][100];
int n,m;
int jx[] = {0,1,-1,0};
int jy[] = {1,0,0,-1};
int tt;
struct node
{
int x,y,z;
}q[10000];
void tf(int k)
{
if(q[k].z!=-1)
{
tf(q[k].z);
printf("(%d, %d)\n",q[k].x,q[k].y);
}
}
void BFS(int s,int e)
{
memset(v,0,sizeof(v));
struct node t,f;
int i;
t.x = s;
t.y = e;
t.z = -1;
v[t.x][t.y] = 1;
q[e++] = t;
while(s<e)
{
t = q[s++];
if(t.x == 4 && t.y == 4)
{
printf("(0, 0)\n");
tf(s-1);
return ;
}
for(i=0;i<4;i++)
{
f.x = t.x + jx[i];
f.y = t.y + jy[i];
if(f.x>=0 && f.x<=4 && f.y>=0 && f.y<=4 && map[f.x][f.y] == 0 && v[f.x][f.y] == 0)
{
f.z = s-1;
q[e++] = f;
v[f.x][f.y] = 1;
}
}
}
}
int main()
{
int i,j;
tt = 0;
n = 5;
m = 5;
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&map[i][j]);
}
}
BFS(0,0);
return 0;
}