题目要求:输入一个数n。接着输入一个n行n列的迷宫。0代表可以走,1代表不能走,2代表唐僧的位置。如果悟空能碰到唐僧,输出yes,否则输出no。
代码如下:
#include<iostream>
using namespace std;
//准备相关的数据
int a[101][101];//二维矩阵表示地图
int v[101][101];//标记数组 标记位置是否走过
int n;//地图大小,行列
int dx[4]= {-1,0,1,0}; //x方向 上 下 左 右
int dy[4]= {0,1,0,-1}; //y方向 上 下 左 右
bool flag=false; //true表示找到,false没有找到
void dfs(int x,int y) {
//判断下搜索结果
if(a[x][y]==2) {
flag=true;//修改标签
return;
}
//进行正常搜索
//1 确定搜索方向
for(int i=0; i<4; i++) {
int nx=x+dx[i];//要搜索的方向 x
int ny=y+dy[i];//要搜索的方向 y
//dx和dy组合后的搜索顺序是:左 下 右 上
if(nx>=0 && nx<n && ny>=0 && ny<n && a[nx][ny]!=1 &&v[nx][ny]==0) {
v[nx][ny]=1;
dfs(nx,ny);
//回溯
//如果走不通,需要返回之后要把地图恢复到原来状态。
v[nx][ny]=0;
}
}
}
int main() {
cin>>n;
//初始化地图
for(int i=0; i<n; i++) {//行
for(int j=0; j<n; j++) {//列
cin>>a[i][j];
}
}
//从左上角开始搜索
if(a[0][0]==2) {
cout<<"yes"; //找到了,结束
return 0;
} else if(a[0][0]==1) {
cout<<"no"; //找不到,结束
return 0;
} else {
v[0][0]=1;//标记当前位置已走过
dfs(0,0);//从0 0位置进行深搜
if(flag==true) cout<<"yes";
else cout<<"no";
}
//搜索结果
return 0;
}
/*
搜索算法:根据要搜索的目标位置,在满足一定的搜索条件(在迷宫内 路可以走 不走重复的路)下,
我们可以从搜索的不同的方向(四个方向 八个方向 十二个方向)进行搜索,遇到不满足的搜索条件,
返回到上一步 ——无路可走
深度优先搜索 ——能搜就搜 不能就退(回溯)---
depth first search DFS
*/
这道题的解题关键就是要抓清深搜的精髓——回溯,然后就十分好解了。
常见错因:
1.dx dy数组写错。
2.x和y写反。
3.判断条件写错