#include <bits/stdc++.h>
using namespace std;
const int N=105;
char p[N][N];//存地图
bool st[N][N];//标记是否访问
int n,m;//全局变量表示终点
bool dfs(int a,int b)//布尔值判断是否找到
{
if(a==n-1&&b==m-1) return true;//表示已经找到
//向下移动
if((a+1<=n-1)&&!st[a+1][b]&&p[a+1][b]=='.')
{
st[a+1][b]=true;//标记访问
if(dfs(a+1,b)) return true;//接着上一层回溯返回true
//这里不需要回溯,不然时间超限
//以下同理解释
}
//向上移动
if((a-1>=0)&&!st[a-1][b]&&p[a-1][b]=='.')
{
st[a-1][b]=true;
if(dfs(a-1,b)) return true;
}
//向左移动
if((b-1>=0)&&!st[a][b-1]&&p[a][b-1]=='.')
{
st[a][b-1]=true;
if(dfs(a,b-1)) return true;
}
//向右移动
if((b+1<=m-1)&&!st[a][b+1]&&p[a][b+1]=='.')
{
st[a][b+1]=true;
if(dfs(a,b+1)) return true;
}
return false;//全部尝试过后没有找到
}
int main() {
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>p[i][j];
}
}
st[0][0]=true;//标记初始点已经访问
if(dfs(0,0)) cout<<"Yes";
else cout<<"No";
return 0;
}
// 64 位输出请用 printf("%lld")
题目重述:
背景:一个n*m的矩阵迷宫
"."表示空地,"#"表示墙
移动规则:每次只可以上下左右移动;
起点(1,1) 终点(n,m)
任务:
判断旺仔能否走出迷宫//找到一种旺仔可以走到终点的情况。
解题思想:
DFS:尝试每次移动的可能性,找到一种可能的情况。
算法设计:
1.用二维数组储存地图。
2函数返回类型布尔型。
3.访问标记 每次移动数组下标变化情况
4找到的条件if(a==n-1&&b==m-1) return true
常见错误:
1数组开小
2加了回溯//我们不需要找到所有情况,只要一种情况就可以不用回溯
3边界处理//不可以!st[a+1][b]再判断(a-1>=0)这样会导致数组访问越界
4 初始点没有标记访问st[0][0]=true;



京公网安备 11010502036488号