• 洛谷 P1363 幻想迷宫


    题目描述

    背景 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组数据.

    dfs

    无限远就是能回到原点

    屠龙宝刀点击就送

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #define N 1505
    int n,m,sx,sy,fx[5]={0,-1,1,0},fy[6]={-1,0,0,1},flag[N][N][3];
    char Map[N][N];
    using namespace std;
    struct node
    {
        int x,y;
    };
    bool dfs(int u,int v,int pre)
    {
        int tx=(u%n+n)%n,ty=(v%m+m)%m;
        if(!tx) tx=n;
        if(!ty) ty=m;
        if(Map[tx][ty]=='#') return false;
        if(flag[tx][ty][1]!=0xefefefef) return flag[tx][ty][1]!=u||flag[tx][ty][2]!=v;
        flag[tx][ty][1]=u;
        flag[tx][ty][2]=v;
        for(int i=0;i<4;++i)
        {
            if(i+pre==3) continue;
            int tx=u+fx[i],ty=v+fy[i];
            if(dfs(tx,ty,i)) return true;
        }
        return false;
    }
    int main()
    {
        for(;scanf("%d%d",&n,&m)!=EOF;)
        {
            for(int i=1;i<=n;++i)
            {
                for(int j=1;j<=m;++j)
                {
                    cin>>Map[i][j];
                    if(Map[i][j]=='S')
                    {
                        sx=i;
                        sy=j;
                    }
                    flag[i][j][1]=flag[i][j][2]=0xefefefef;
                }
            }
            if(dfs(sx,sy,233)) puts("Yes");
            else puts("No");
        }
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    必须掌握的八个DOS命令
    实况足球8 功略简解
    开始→运行→命令集锦
    必须掌握的八个DOS命令
    对称加密算法之DES算法
    让你的Linux像黑客帝国的画面一样炫酷
    古典密码之凯撒密码and换位密码
    用eclipse写jsp报以下错误
    mysql安装后,过一段时间,在命令行无法启动
    sql 日期函数
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7418437.html
Copyright © 2020-2023  润新知