迷宫问题
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)
解题思路:我用的是深搜,从(5,5)开始搜索,把所有可能的路径全部搜一遍,且都必须是最短的路径,搜索的过程中记录一下每一个点的前驱节点(用来搜索完毕之后输出路径)
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<ctype.h> 5 6 struct data { 7 int a,b,c;//a,b用来记录对应点的前驱节点,c用来记录从(5,5)到这个点的最短路径长度; 8 }vis[10][10]; 9 int line[10][10]; 10 int aa[4][2]={0,1,1,0,0,-1,-1,0};//方向:上,下,左,右; 11 int dfs(int x,int y,int num) 12 { 13 int q,w,i,j; 14 num++; 15 for(i=0;i<4;i++){ 16 q=x+aa[i][0]; 17 w=y+aa[i][1]; 18 if(line[q][w]==0){ 19 if(vis[q][w].c==0||vis[q][w].c>num){//判断如果这个点没有走过,或者现在走到这个点的路径长度比记录的短的时候就更新这个节点; 20 vis[q][w].c=num; 21 vis[q][w].a=x; 22 vis[q][w].b=y; 23 dfs(q,w,num); 24 } 25 } 26 } 27 } 28 int main () 29 { 30 int i,j; 31 memset(line,1,sizeof(line)); 32 memset(vis,0,sizeof(vis)); 33 for(i=1;i<=5;i++){//因为给出图只有5*5的大小,所以可以使用邻接矩阵来存储; 34 for(j=1;j<=5;j++){ 35 scanf("%d",&line[i][j]); 36 } 37 } 38 vis[5][5].c=1; 39 dfs(5,5,1); 40 int x,y,q,w; 41 x=y=1; 42 while(x!=5||y!=5){//通过每一个点搜索时记录的前驱节点的信息,从(1,1)开始输出所有的节点; 43 printf("(%d, %d)\n",x-1,y-1); 44 q=vis[x][y].a; 45 w=vis[x][y].b; 46 x=q; 47 y=w; 48 } 49 printf("(4, 4)\n"); 50 return 0; 51 }