首先输入一个迷宫,用0,1表示,如:m行n列的迷宫
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
0表示通路,1表示障碍。
然后输入起始点的坐标和终止点的坐标,求从起点到终点最少的步数。
用dfs,代码如下:
<span style="font-size:18px;">#include<stdio.h>
int book[51][51],p[51][51];
int min=99999,endx,endy;//因为终点坐标要在dfs和主函数中使用,所以应该用全局变量
int m,n;
void dfs(int x,int y,int step)
{
int tx,ty;
int next[4][4]={{0,1},{-1,0},{0,-1},{1,0}};//数组代表上下左右四个方向
if(x==endx&&y==endy)//当起点和终点相等的时候
{
if(step<min)//求最小步数
min=step;
return;//必须要有
}
for(int k=0;k<=3;k++)//从上下左右四个不同的方向进行搜索
{
tx=x+next[k][0];
ty=y+next[k][1];
if(tx<0||tx>=m||ty<0||ty>=n)//超出迷宫边界时,continue
{
continue;
}
if(book[tx][ty]==0&&p[tx][ty]==0)//如果当前坐标没有被走过,并且不是障碍
{
book[tx][ty]=1;//把当前坐标标记为走过
dfs(tx,ty,step+1);进行下一阶段的dfs
book[tx][ty]=0;回溯再次搜索时释放已标记的路径
}
}
return;
}
int main(void)
{
int beginx,beginy;
scanf("%d%d",&m,&n);//输入行和列
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&p[i][j]);//输入迷宫,0,1表示
}
scanf("%d%d%d%d",&beginx,&beginy,&endx,&endy);//输入起点和终点的坐标
book[beginx][beginy]=1;//book是标记数组,值为1的时候,代表此坐标已经走过,因为起点已经走过,所以首先置为1
dfs(beginx,beginy,0);当前阶段已经做完,并且一步还没有走,所以转向下一个阶段
printf("%d\n",min);
return 0;
}</span>
原文地址:http://blog.csdn.net/u013240038/article/details/45126795