• [luogu p1363] 幻象迷宫


    传送门

    幻象迷宫

    题目描述

    (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫。)

    WD:呜呜,肿么办啊......

    LHX:momo...我们一定能走出去的!

    WD:嗯,+U+U!

    描述 Description

    幻象迷宫可以认为是无限大的,不过它由若干个N*M的矩阵重复组成。矩阵中有的地方是道路,用'.'表示;有的地方是墙,用'#'表示。LHX和WD所在的位置用'S'表示。也就是对于迷宫中的一个点(x,y),如果(x mod n,y mod m)是'.'或者'S',那么这个地方是道路;如果(x mod n,y mod m)是'#',那么这个地方是墙。LHX和WD可以向上下左右四个方向移动,当然不能移动到墙上。

    请你告诉LHX和WD,它们能否走出幻象迷宫(如果它们能走到距离起点无限远处,就认为能走出去)。如果不能的话,LHX就只好启动城堡的毁灭程序了......当然不到万不得已,他不想这么做。。。

    输入输出格式

    输入格式

    输入包含多组数据,以EOF结尾。

    每组数据的第一行是两个整数N、M。

    接下来是一个N*M的字符矩阵,表示迷宫里(0,0)到(n-1,m-1)这个矩阵单元。

    输出格式

    对于每组数据,输出一个字符串,Yes或者No。

    输入输出样例

    输入样例 #1

    5 4
    ##.#
    ##S#
    #..#
    #.##
    #..#
    5 4
    ##.#
    ##S#
    #..#
    ..#.
    
    #.##
    

    输出样例 #1

    Yes
    No
    
    

    说明

    对于30%的数据,N,M<=20

    对于50%的数据,N.M<=100.

    对于100%的数据,N,M<=1500,每个测试点不超过10组数据.

    分析

    本题思路:将地图拓展,记录对于一个单位地图的相对位置x, y和记录整个拓展地图的绝对位置ux,uy。

    显然如果第一次走过这个位置,x = ux且y = uy,那么如果x != ux 或者 y != uy,说明当前点被走了第二遍,那么这就意味着可以无限走下去。

    最近备考,没时间写详细题解了,写个大概思路就行了。

    代码

    /*
     * @Author: crab-in-the-northeast 
     * @Date: 2020-09-26 21:03:11 
     * @Last Modified by: crab-in-the-northeast
     * @Last Modified time: 2020-09-30 18:59:31
     */
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    const int maxn = 1505;
    const int dx[] = {0, 1, -1, 0, 0};
    const int dy[] = {0, 0, 0, 1, -1};
    
    char a[maxn][maxn];
    bool vis[maxn][maxn];
    int visu[maxn][maxn][2];
    bool fnd;
    
    int n, m;
    
    void dfs(int x, int y, int ux, int uy) {
        if (fnd) return ;
        if (vis[x][y] && (visu[x][y][0] != ux || visu[x][y][1] != uy)) {
            fnd = true;
            return ;
        }
    
        vis[x][y] = true;
        visu[x][y][0] = ux;
        visu[x][y][1] = uy;
    
        for (int i = 1; i <= 4; ++i) {
            int nxtx = (x + dx[i] + n - 1) % n + 1;
            int nxty = (y + dy[i] + m - 1) % m + 1;
            int nxtux = ux + dx[i];
            int nxtuy = uy + dy[i];
    
            if (a[nxtx][nxty] != '#')
                if (!vis[nxtx][nxty] || visu[nxtx][nxty][0] != nxtux || visu[nxtx][nxty][1] != nxtuy)
                    dfs(nxtx, nxty, nxtux, nxtuy);
        }
    }
    
    int main() {
        while (~std :: scanf("%d %d", &n, &m)) {
            fnd = false;
            int sx, sy;
            for (int i = 1; i <= n; ++i)
                for (int j = 1; j <= m; ++j)
                    vis[i][j] = false;
    
            for (int i = 1; i <= n; ++i) {
                std :: scanf("%s", a[i] + 1);
                for (int j = 1; j <= m; ++j)
                    if (a[i][j] == 'S') {
                        sx = i;
                        sy = j;
                    }
            }
    
            dfs(sx, sy, sx, sy);
            std :: printf("%s
    ", fnd ? "Yes" : "No");
        }
    
        return 0;
    }
    

    评测记录

    评测记录

  • 相关阅读:
    case when if
    存储过程 、函数和事务
    poj 2263
    hdu -1874
    poj 2472
    2544 hdu
    模板floyed
    模板Dijkstra
    hdu 2066
    hdu 2544
  • 原文地址:https://www.cnblogs.com/crab-in-the-northeast/p/luogu-p1363.html
Copyright © 2020-2023  润新知