一、AcWing 1112. 迷宫
【题目描述】
 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由
    
     
      
       
        n
       
       
        ∗
       
       
        n
       
      
      
       n∗n
      
     
    n∗n的格点组成,每个格点只有
    
     
      
       
        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
      
     
    n∗n的。
 接下来是一个
    
     
      
       
        n
       
       
        ∗
       
       
        n
       
      
      
       n∗n
      
     
    n∗n的矩阵,矩阵中的元素为.或者#。
 再接下来一行是
    
     
      
       
        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
      
     
    1≤n≤100
【输入样例】
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;
}










