牛客[走出迷宫]
https://ac.nowcoder.com/acm/problem/14572
题目:
思路:
从起点开始深搜,使用一个 b o o l bool bool值进行判断,如果遇到了终点就变成 t r u e true true
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAX = 1e5 + 5;
char Map[510][510];
bool is=false;
// 地图长宽 当前位置
void dfs(int N, int M, int x, int y){
if(Map[x][y]=='E'){
is=true;
}
Map[x][y]='#';
if(is) return ;
int mark[][2]={{1,0},{-1,0},{0,1},{0,-1}};
for(int i=0;i<4;i++){
int tx=x+mark[i][0];
int ty=y+mark[i][1];
if(tx>0&&tx<=N&&ty>0&&ty<=M&&Map[tx][ty]!='#'){
dfs(N,M,tx,ty);
}
}
}
int main(){
int N,M;
int Sx,Sy;
while(scanf("%d %d",&N,&M)!=EOF){
getchar();
for(int i=1;i<=N;i++){
for(int o=1;o<=M;o++){
scanf("%c",&Map[i][o]);
if(Map[i][o]=='S'){
Sx=i;
Sy=o;
}
}
getchar();
}
is= false;
dfs(N, M, Sx, Sy);
if(is) printf("Yes\n");
else printf("No\n");
}
return 0;
}
BFS写法:
从起点开始搜索,把遇到的每一个能进的点加入队列,直到队列为空(没找到)或者遇到终点(找到了)就退出循环
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAX = 1e5 + 5;
char Map[510][510]={0};
int N,M;
int Sx,Sy;
bool is=false;
queue<pair<int,int>> q;
void bfs(pair<int,int> A){
if(Map[A.first][A.second]=='E') is=true;
if(is) return;
Map[A.first][A.second]='#';
int mark[][2]={{1,0},{-1,0},{0,1},{0,-1}};
for(int i=0;i<4;i++){
int tx=A.first+mark[i][0];
int ty=A.second+mark[i][1];
if(tx>0&&tx<=N&&ty>0&&ty<=M&&Map[tx][ty]!='#'){
q.push({tx,ty});
}
}
}
int main(){
while(scanf("%d %d",&N,&M)!=EOF){
getchar();
for(int i=1;i<=N;i++){
for(int o=1;o<=M;o++){
scanf("%c",&Map[i][o]);
if(Map[i][o]=='S'){
Sx=i;
Sy=o;
}
}
getchar();
}
is= false;
q.push({Sx,Sy});
while(q.size()){
pair<int,int> A =q.front();
q.pop();
if(!is) bfs(A);
}
if(is) printf("Yes\n");
else printf("No\n");
}
return 0;
}