题目链接: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(); } }
谢谢浏览哈!