题目:
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,//输入迷宫地图(之所以+2是为了减少
1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,//在边界时的讨论)
1,1,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1,
1,0,1,1,0,0,0,0,1,1,1,1,0,0,1,1,1,
1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,
1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,
1,1,1,0,1,0,0,1,0,1,1,1,1,1,1,1,1,
1,0,0,1,1,0,1,1,1,0,1,0,0,1,1,1,1,
1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,
1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,
1,1,1,0,0,0,1,1,0,1,1,0,0,0,1,0,1,
1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1,
1,0,1,0,0,1,1,1,1,1,0,1,1,1,1,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
有如上的一个二维数组,用来表示一个地图,其中0表示可以通过,1表示墙,一个老鼠从右下角的起点出发,如何才能到左上角,输出路径
算法思想:回溯
具体解析:首先从起点开始,依次往各个方向进行查看,如果可以通过那么向前进,然后在这个点继续依次往各个方向查看(这里就是回溯)。直到最后找到终点为止。
代码:
#include<stdio.h>
#define M 12
#define N 15
int maze[M+2][N+2]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,//输入迷宫地图(之所以+2是为了减少
1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,//在边界时的讨论)
1,1,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1,
1,0,1,1,0,0,0,0,1,1,1,1,0,0,1,1,1,
1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,
1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,
1,1,1,0,1,0,0,1,0,1,1,1,1,1,1,1,1,
1,0,0,1,1,0,1,1,1,0,1,0,0,1,1,1,1,
1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,
1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,
1,1,1,0,0,0,1,1,0,1,1,0,0,0,1,0,1,
1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1,
1,0,1,0,0,1,1,1,1,1,0,1,1,1,1,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int mark[M+2][N+2];
int move[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,1},{1,-1},{-1,1}};
int seepath(int x,int y)
{
int i,g,h;
if(x==1&&y==1)
return 1;
else
for(i=0;i<8;i++)
{
g=x+move[i][0];
h=y+move[i][1];
if(maze[g][h]==0&&mark[g][h]==0)
{
mark[g][h]=1;
if(seepath(g,h))
{
printf("(%d,%d)",g,h);
if(move[i][0]==-1&&move[i][1]==-1)printf("westnorth->");
if(move[i][0]==-1&&move[i][1]==0)printf("west->");
if(move[i][0]==-1&&move[i][1]==1)printf("westsouth->");
if(move[i][0]==0&&move[i][1]==-1)printf("north->");
if(move[i][0]==0&&move[i][1]==1)printf("south->");
if(move[i][0]==1&&move[i][1]==-1)printf("easthnorth->");
if(move[i][0]==1&&move[i][1]==0)printf("easth->");
if(move[i][0]==1&&move[i][1]==1)printf("easthsouth->");
printf("\n");
maze[g][h]=8;
return 1;
}
}
}
if(x==M&&y==N)
printf("no path\n");
return 0;
}
int main()
{
int i,j;
for(i=0;i<M+2;i++)
for(j=0;j<N+2;j++)
mark[i][j]=0;
mark[M][N]=1;
if(seepath(M,N))
{
printf("(%d,%d)",M,N);
printf("\n");
maze[M][N]=8;//将起点设为通路
for (i=1;i<M+1;i++)
for (j=1;j<N+1;j++)
{
printf("%2d",maze[i][j]);
if(j==N)
printf("\n");
}//打印出走通后的迷宫
}
return 0;
}