首先输入一个迷宫,用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>
时间: 2024-10-16 04:12:02