牛客_NC14572(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;

void DFS(int x,int y) {
    if (arr[x][y]=='E') {
        isFind = true;
        return ;
    }
    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);
            if (isFind) {    
                return;
            }
        }
    }
    return ;
}

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;
        }
    }
}

 

 

posted @ 2022-03-01 21:44  火星架构师  阅读(127)  评论(0编辑  收藏  举报