2018年东北农业大学春季校赛 D wyh的迷宫【搜索】

链接:https://www.nowcoder.com/acm/contest/93/D
来源:牛客网

题目描述

给你一个n*m的迷宫,这个迷宫中有以下几个标识:

s代表起点

t代表终点

x代表障碍物

.代表空地

现在你们涵哥想知道能不能从起点走到终点不碰到障碍物(只能上下左右进行移动,并且不能移动到已经移动过的点)。

输入描述:

输入第一行一个整数T(1<=T<=10)
接下来有T组测试数据,对于每一组测试数据,第一行输入2个数n和m(1<=n,m<=500)
接下来n行,每行m个字符代表这个迷宫,每个字符都是上面4个中的一种
数据保证只有一个起点和一个终点

输出描述:

对于每一组测试数据,如果可以的话输出YES,不可以的话输出NO
示例1

输入

1
3 5
s...x
x...x
...tx

输出

YES
【分析】:判断地图可达性。可以DFS搜索看是否可以到达终点,某点a[x][y] == 't'(终点) or v[ex][ey]==1(终点坐标) 就说明可以,输出YES
【代码】:
#include<bits/stdc++.h>

using namespace std;
#define ll long long
#define N 550

int t;
char a[N][N];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, -1, 0, 1};
int v[N][N];
int f;
int n, m;

int ok(int tx, int ty)
{
    if(tx>=0 && tx<n && ty>=0 && ty<m && a[tx][ty]!='x' && v[tx][ty] == 0)
        return 1;
    else return 0;
}

void dfs(int x, int y)
{
    v[x][y] = 1;
    if(a[x][y] == 't'){
        f = 1;
        return ;
    }
    for(int i=0; i<4; i++){
        int x1 = x + dx[i];
        int y1 = y + dy[i];
        if(ok(x1,y1))
            dfs(x1,y1);
    }

}

int main()
{
    int t, sx, sy;
    scanf("%d", &t);
    while(t--) {
        f = 0;
        scanf("%d %d", &n, &m);
        memset(v, 0, sizeof(v));

        for(int i = 0; i < n; i++) {
            scanf("%s", a[i]);
        }

        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(a[i][j] == 's') {
                    sx = i;
                    sy = j;
                    break;
                }
            }
        }
        dfs(sx, sy);
        if(f == 1)
            printf("YES
");
        else
            printf("NO
");
    }
    return 0;
}
/*
1
3 5
s...x
x...x
...tx
*/
dfs
原文地址:https://www.cnblogs.com/Roni-i/p/8724843.html