0
点赞
收藏
分享

微信扫一扫

【算法题归纳合集】搜索-DFS之连通性模型

飞鸟不急 2022-01-23 阅读 54

一、AcWing 1112. 迷宫

【题目描述】
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n ∗ n n∗n nn的格点组成,每个格点只有 2 2 2种状态,.#,前者表示可以通行后者表示不能通行。
同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点 A A A走到点 B B B,问在不走出迷宫的情况下能不能办到。
如果起点或者终点有一个不能通行(为#),则看成无法办到。
注意: A , B A,B A,B不一定是两个不同的点。

【输入格式】
第1行是测试数据的组数 k k k,后面跟着 k k k组输入。
每组测试数据的第 1 1 1行是一个正整数 n n n,表示迷宫的规模是 n ∗ n n∗n nn的。
接下来是一个 n ∗ n n∗n nn的矩阵,矩阵中的元素为.或者#
再接下来一行是 4 4 4个整数 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2 x1,y1,x2,y2,描述 A A A处在第 x 1 x_1 x1行, 第 y 1 y_1 y1列, B B B处在第 x 2 x_2 x2行, 第 y 2 y_2 y2列。
注意到 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2 x1,y1,x2,y2全部是从 0 0 0开始计数的。

【输出格式】
k k k行,每行输出对应一个输入。
能办到则输出YES,否则输出NO

【数据范围】
1 ≤ n ≤ 100 1≤n≤100 1n100

【输入样例】

2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0

【输出样例】

YES
NO

【分析】


很简单的题目,当不需要求解最短距离时使用DFS求出起点与终点是否连通即可,注意本题的坑点为起点也可能是#,因此将判断条件放在DFS的开头部分比较好。


【代码】

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 110;
char g[N][N];
int x1, y1, x2, y2;
int n, k;
bool st[N][N];
int dx[4] = { -1, 0, 1, 0 }, dy[4] = { 0, 1, 0, -1 };

bool dfs(int x, int y)
{
    if (g[x][y] == '#' || x < 0 || x >= n || y < 0 || y >= n || st[x][y]) return false;
    if (x == x2 && y == y2) return true;
    st[x][y] = true;
    for (int i = 0; i < 4; i++)
        if (dfs(x + dx[i], y + dy[i])) return true;
    return false;
}

int main()
{
    cin >> k;
    while (k--)
    {
        cin >> n;
        for (int i = 0; i < n; i++) cin >> g[i];
        memset(st, false, sizeof st);
        cin >> x1 >> y1 >> x2 >> y2;
        if (dfs(x1, y1)) puts("YES");
        else puts("NO");
    }
    return 0;
}

二、AcWing 1113. 红与黑

举报

相关推荐

0 条评论