• 幻想迷宫


    题目描述

    背景 Background

    (喵星人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就只好启动城堡的毁灭程序了……当然不到万不得已,他不想这么做。。。

    输入输出格式

    输入格式:

    输入格式 InputFormat

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

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

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

    输出格式:

    输出格式 OutputFormat

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

    输入输出样例

    输入样例#1: 复制
    5 4
    ##.#
    ##S#
    #..#
    #.##
    #..#
    5 4
    ##.#
    ##S#
    #..#
    ..#.
    #.##
    
    输出样例#1: 复制
    Yes
    No
    
    

    说明

    数据范围和注释 Hint

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

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

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

    【题解】对于整个迷宫,如果能无限走可想而知左边就是相对于中间是负的超出n,m如图,所以我们只要记录下访问时候的绝对坐标,然后转换成相对坐标即可。

    #include<cstdio>
    #include<cstring>
    char s[1510][1510];
    int dx[]= {-1,0,1,0},dy[]= {0,1,0,-1};
    int n,m,sx,sy;
    bool v[1510][1510];
    struct T {
        int x,y;
    } a[1510][1510];
    bool dfs(int x,int y) {
        int px=(x%n+n)%n,py=(y%m+m)%m;
        if(s[px][py]=='#')return false;
        T &p=a[px][py];
        if(v[px][py])return p.x!=x||p.y!=y;
        v[px][py]=true;
        p.x=x,p.y=y;
        for(int i=0; i<4; i++)
            if(dfs(x+dx[i],y+dy[i]))return true;
        return false;
    }
    int main() {
        while(~scanf("%d%d",&n,&m)) {
            memset(v,0,sizeof(v));
            memset(a,0,sizeof(a));
            for(int i=0; i<n; i++) {
                scanf("%s",s[i]);
                for(int j=0; j<m; j++)
                    if(s[i][j]=='S') {
                        sx=i,sy=j;
                        s[sx][sy]='.';
                    }
            }
            if(dfs(sx,sy))puts("Yes");
            else puts("No");
        }
        return 0;
    }
  • 相关阅读:
    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9
    python的基本语法
    POSIX标准 库文件
    C 标准库头文件
    管理工具:SWOT、PDCA、6W2H、SMART、WBS、时间管理
    函数指针和指针函数的区别
    Linux之正则表达式1
    windows与linux换行规则
    Linux之find
    Linux之文件(目录)默认权限、特殊权限与隐藏权限
  • 原文地址:https://www.cnblogs.com/kcfzyhq/p/8543171.html
Copyright © 2020-2023  润新知