1. 程式人生 > 其它 >牛客_NC14572(DFS)

牛客_NC14572(DFS)

DFS

連結:https://ac.nowcoder.com/acm/problem/14572?&headNav=acm
來源:牛客網

題目描述

小明現在在玩一個遊戲,遊戲來到了教學關卡,迷宮是一個N*M的矩陣。 小明的起點在地圖中用“S”來表示,終點用“E”來表示,障礙物用“#”來表示,空地用“.”來表示。 障礙物不能通過。小明如果現在在點(x,y)處,那麼下一步只能走到相鄰的四個格子中的某一個:(x+1,y),(x-1,y),(x,y+1),(x,y-1); 小明想要知道,現在他能否從起點走到終點。

輸入描述:

本題包含多組資料。
每組資料先輸入兩個數字N,M
接下來N行,每行M個字元,表示地圖的狀態。
資料範圍:
2<=N,M<=500
保證有一個起點S,同時保證有一個終點E.

輸出描述:

每組資料輸出一行,如果小明能夠從起點走到終點,那麼輸出Yes,否則輸出No

輸入

3 3
S..
..E
...
3 3
S##
###
##E

輸出

Yes
No

/*
-------------------------------------------------
   Author:       wry
   date:         2022/2/26 17:14
   Description:  test
-------------------------------------------------
*/

#include <bits/stdc++.h>

using
namespace std; const int MAXN = 500+10; int dis[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; int n,m; //n行m列 char arr[MAXN][MAXN]; bool visited[MAXN][MAXN]; bool isFind = false; bool DFS(int x,int y) { if (arr[x][y]=='E') { isFind = true; return true; } for (int i=0;i<4;i++) {
int nx = x+dis[i][0]; int ny = y+dis[i][1]; if (nx>=0 && nx<n && ny>=0 && ny<m && !visited[nx][ny]) { visited[nx][ny]=true; DFS(nx,ny); } } return false; } int main() { int startx,starty; while (cin>>n>>m) { isFind = false; memset(arr,NULL,sizeof(arr)); memset(visited, false,sizeof(visited)); for (int i=0;i<n;i++) { for (int j=0;j<m;j++) { cin >> arr[i][j]; if (arr[i][j]=='#') { visited[i][j] = true; } if (arr[i][j]=='S') { visited[i][j] = true; startx = i; starty = j; } } } DFS(startx,starty); if (isFind) { cout << "Yes" << endl; } else { cout << "No" << endl; } } }