深搜01【P1238】走迷宫——迷宫问题的总结
迷宫问题是搜索题的常考题型。
搜索分为:BFS(广搜)和DFS(深搜),选用恰当的搜索方式是解题的重点。
(1)题目要求 打印出所有路径:适用于深搜(步步++ 存储路径,调用自己)。
(2)题目要求 打印出最短路径:适用于广搜(标记前驱找最短路径)。
【P1238】走迷宫:就是要求打印出所有路径,显然是广搜。
//试题分析:本题是深搜基本题型 //用vis[][]存储一步步走过的路径; 用a[]和b[]存储路径位置(下标) //不断的输出,不断的进行递归调用自己 #include<iostream> #include<cstdio> using namespace std; int u[5]={0,0,-1,0,1}; //扩展方向 int w[5]={0,-1,0,1,0}; int n,m,i,j,desx,desy,soux,souy,x,y,a[200],b[200],map[51][51]; bool f,vis[51][51]; void dfs(int x,int y,int step) { if(x==desx&&y==desy) { //递归条件出口(到达终点) for(int i=1;i<step;i++) //输出路径a,b中一步步存储的路径。 cout<<"("<<a[i]<<","<<b[i]<<")->"; cout<<"("<<desx<<","<<desy<<")"<<endl; f=true; //bool 标记有路线 return; } vis[x][y]=true; a[step]=x;b[step]=y; for(int i=1;i<=4;i++) { //扩展方向,扩展一步后再递归伸手 int tx=x+u[i],ty=y+w[i]; if(tx>0&&ty>0&&tx<=n&&ty<=m&&map[tx][ty]&&!vis[tx][ty]) dfs(tx,ty,step+1); } vis[x][y]=false; //回溯 } int main() { int i,j; cin>>n>>m; //迷宫行列值 for(i=1;i<=n;i++) //迷宫二维表初始化 for(j=1;j<=m;j++) cin>>map[i][j]; cin>>soux>>souy; //入口坐标 cin>>desx>>desy; //出口坐标 f=false; dfs(soux,souy,1); // 从坐标的第一步开始 if(!f)cout<<-1<<endl; return 0; }
浙公网安备 33010602011771号