牛客 走出迷宫
题目:
链接https://ac.nowcoder.com/acm/problem/14572
思路:
用dfs的染色法(bk记录数组不进行回溯),根据题目可得,边界条件为数组边界,走到#(障碍物)返回,结束条件为找到E(终点),把标志位设为1,即已找到,整个dfs结束。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,b[505][505];
char a[5000][5000];
int bo=0;
void dfs(int i,int j) {
if(b[i][j]==1)return;//走过了不走了
if(i<0||i>=n||j<0||j>=m) return;//数组边界
if(a[i][j]=='#')return;//障碍物
if(bo)return;//bo为1即找到了 dfs结束
if(a[i][j]=='E') {//找到终点
bo=1;//标志位设为1
cout << "Yes" <<endl;return;
}
b[i][j]=1;//染色,表示/走过了
dfs(i+1,j);//上下左右递归
dfs(i-1,j);
dfs(i,j-1);
dfs(i,j+1);
}
int main() {
while(cin >> n >> m){
int x ,y;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++){
cin >> a[i][j];
if(a[i][j]=='S'){//设置起点
x=i;y=j;
}
}
bo=0;
dfs(x,y);
memset(b,0,505*505);
if(bo==0)cout << "No" <<endl;//标志位不为一即没有找到
}
return 0;
}