zoukankan      html  css  js  c++  java
  • 洛谷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。

    首先地图是无限大的,也就是说坐标可以是任意值(包括负数),但不同的坐标都可以按题目中规则映射到n*m的地图上来。

    若可以走到无限远,则Yes。实际计算时当然不可能处理“无限”的情况,只要发现“映射到同一个位置”的坐标可以不同,就说明有解。(走到了另一块地图,那么就可以按照同样的方式走到更远的一块地图)。

     1 /*by SilverN*/
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #include<vector>
     8 using namespace std;
     9 const int mx[5]={0,1,0,-1,0};
    10 const int my[5]={0,0,1,0,-1};
    11 const int mxn=1501;
    12 int vx[mxn][mxn];
    13 int vy[mxn][mxn];
    14 int n,m;
    15 //bool mp[mxn][mxn];
    16 int sx,sy;
    17 //char s[mxn];
    18 char mp[mxn][mxn];
    19 bool DFS(int x,int y){
    20     int ax=(x%n+n)%n,ay=(y%m+m)%m;
    21     if(mp[ax][ay]=='#')return 0;
    22     if(vx[ax][ay]!=0x3f3f3f3f){
    23         return (vx[ax][ay]!=x || vy[ax][ay]!=y);
    24     }
    25     vx[ax][ay]=x;
    26     vy[ax][ay]=y;
    27     for(int i=1;i<=4;i++)
    28         if(DFS(x+mx[i],y+my[i]))return 1;
    29     return 0;
    30 }
    31 int main(){
    32 //    while( scanf("%d%d",&n,&m)!=EOF){
    33     while( cin>>n>>m ){
    34         memset(vx,0x3f,sizeof vx);
    35         memset(vy,0x3f,sizeof vy);
    36         int i,j;
    37         for(i=0;i<n;i++){
    38 //            scanf("%s",mp[i]);
    39 //            if(!flag)
    40             for(j=0;j<m;j++){
    41                 cin>>mp[i][j];
    42                 if(mp[i][j]=='S'){
    43                     mp[i][j]='.';
    44 //                    flag=1;
    45                     sx=i;sy=j;
    46                 }
    47             }
    48         }
    49         if(DFS(sx,sy))printf("Yes
    ");
    50         else printf("No
    ");
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    动态规划——Best Time to Buy and Sell Stock IV
    动态规划——Split Array Largest Sum
    动态规划——Burst Ballons
    动态规划——Best Time to Buy and Sell Stock III
    动态规划——Edit Distance
    动态规划——Longest Valid Parentheses
    动态规划——Valid Permutations for DI Sequence
    构建之法阅读笔记05
    构建之法阅读笔记04
    构建之法阅读笔记03
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6045072.html
Copyright © 2011-2022 走看看