题解 | #迷宫问题#
迷宫问题
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
DFS方法解决:主要是理解递归思想
在输出路径的时候,需要将最短路径的情况保存下来,然后进行递归输出
#include<stdio.h> int n,m; int maze[15][15]={0}; int his[15][15]={0}; int his2[15][15]={0}; int print[15][15]={0}; int min=999; int startx,starty; int endx,endy; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; void dfs(int x,int y,int step) { int tx,ty; if(x==endx&&y==endy) { if(step<min) { min=step; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { print[i][j]=his[i][j]; } } } return; } for(int k=0;k<4;k++) { tx=x+dx[k]; ty=y+dy[k]; if(tx>=0&&tx<n&&ty>=0&&ty<m)//判断边界条件 { if(his[tx][ty]==0&&maze[tx][ty]==0) { his[tx][ty]=1; dfs(tx,ty,step+1); his[tx][ty]=0; } } } return; } void display(int x,int y) { if(x==endx&&y==endy) { return; } int tx,ty; for(int k=0;k<4;k++) { tx=x+dx[k]; ty=y+dy[k]; if(tx>=0&&tx<n&&ty>=0&&ty<m)//判断边界条件 { if(print[tx][ty]==1&&his2[tx][ty]==0) { printf("(%d,%d)\n",tx,ty); his2[tx][ty]=1; display(tx,ty); } } } return; } int main(void) { scanf("%d%d",&n,&m); startx=0;starty=0; endx=n-1;endy=m-1; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%d",&maze[i][j]); } }//输入完毕 his[0][0]=1; his2[0][0]=1; dfs(startx,starty,0); printf("(0,0)\n"); display(startx,starty); return 0; }