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)
分析:
越来越感觉学习起来很吃力,很多东西都不懂。
只是一道迷宫问题典型的广搜问题,里边还用了模拟队列。各种方法,各种不理解,我什么时候可以会啊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#include<stdio.h>
#include<string.h>
void print (int value ,int prev[25])
{
if(value>=0)
{
int x=value/5;
int y=value%5;
print(prev[value],prev);
printf("(%d, %d)\n",x,y);
}
}
void solve (int m[5][5])
{
int v[5][5],queue[25],f=0,r=0,x=0,y=0,prev[25];
memset(v,0,sizeof(v));
memset(prev,-1,sizeof(prev));
prev[0]=-1;
int of[4][2]= {1,0,-1,0,0,-1,0,1};
queue[++r]=0;
v[x][y]=1;
while(f<=r)
{
int i,newx,newy;
f++;
x=queue[f]/5;
y=queue[f]%5;
for(i=0; i<4; i++)
{
newx=x+of[i][0];
newy=y+of[i][1];
if(newx>=0&&newx<5&&newy>=0&&newy<5&&!v[newx][newy]&&!m[newx][newy])
{
r=(r+1)%25;
queue[r]=newx*5+newy;
prev[newx*5+newy]=x*5+y;
v[newx][newy]=1;
}
}
}
print(24,prev);
}
int main()
{
int m[5][5],i=0,j=0;
while(scanf("%d",&m[i][j++])!=EOF)
{
if(j==5)
{
i++;
j=0;
}
if(i==5)
{
solve(m);
i=0;
}
}
return 0;
}