题目链接:https://ac.nowcoder.com/acm/problem/14572
分析:很简单的dfs题目,当然也可以用bfs题,对于这类题是都行得通的,因为只要能走到终点就行。下面给出的是dfs的做法,“无脑走全图”。
细节和终点看代码和注释吧!
#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<set>
#include<map>
#define ll long long
using namespace std;
#define close_stdin ios::sync_with_stdio(false)
int n, m;
char mp[505][505],c;
bool vis[505][505];
int dirx[4] = { 0,0,1,-1 }, diry[4] = { 1,-1,0,0 };
int sx, sy,flag=0;
void my_input() { //将地图输入 ,并记录下起点的位置
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++) {
cin >> c;
mp[i][j] = c;
if (c == 'S') { sx = i;sy = j; }
}
}
}
void dfs(int x, int y) {
vis[x][y] = 1; //标记走过的位置
for (int w = 0;w < 4;w++) {
int nx = x + dirx[w];//下一个位置
int ny = y + diry[w];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !vis[nx][ny] && mp[nx][ny] != '#') { //判断下一个位置能否走
if (mp[nx][ny] == 'E') { flag = 1;return; }//是终点 ,说明能走到,标志为1
else dfs(nx, ny); //不是终点且可行,再往下探索
}
}
}
void solve() {
memset(vis, 0, sizeof(vis)); //因为多组数据,所以每组数据处理前要将状态数组全部清0;
flag=0; //能否走到终点的标志
dfs(sx, sy);//从起点开始走
cout << (flag ? "Yes\n" : "No\n");
}
int main() {
close_stdin;//只是为了让cin和printf一样快
while (cin >> n >> m) {
my_input();
solve();
}
}谢谢浏览哈!

京公网安备 11010502036488号