• 幻想迷宫【DFS】


    题目大意:

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

    WD:呜呜,肿么办啊……

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

    WD:嗯,+U+U!

    幻象迷宫可以认为是无限大的,不过它由若干个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就只好启动城堡的毁灭程序了……当然不到万不得已,他不想这么做。。。

    思路:

    这道题要我们求能否走到无限远处,其实很容易想到,它就是要我们求能否从起点到达另一个起点!(因为会瞬移) 

    图片转自https://www.luogu.org/blog/GNAQ/solution-p1363 

    如果能从粉色的S走到黑色的S,那么就肯定能从黑色的S走到棕色的S,那么也能走到下一个S。这样下去,就能走到无限远处。 
    那么第一种思路肯定是开一个9×9的矩阵(如上图),一般来说,9×9就足够我们存所有答案了。 
    但是如果遇到下面这组数据:

    6 20
    #.##.##.##.##.##.##.
    #.##.##.##.##.##.##.
    #.##.##.##.##.##.##.
    S.#..#..#..#..#..#..
    ##..#..#..#..#..#..#
    #..#..#..#..#..#..##

    那就gg了。 
    那么我们又不可能开更大了,所以就只能有一种方法: 
    重复使用一个矩阵。 
    那么就真正得顺瞬移了。每当走出界时,就将它瞬移到对面的那个格子。 
    那么就有很多细节了。打代码时一定要注意细节。

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 const int dx[]={0,0,0,1,-1};
     7 const int dy[]={0,1,-1,0,0};
     8 int n,m,sx,sy;
     9 int a[1511][1511],b[3011][3011],c[1511][1511];
    10 char ch;
    11 
    12 int dfs(int x,int y)  //深搜
    13 {
    14     if (x<0) return(dfs(n*2-1,y)); 
    15     if (y<0) return(dfs(x,m*2-1)); 
    16     if (x>=n*2) return(dfs(0,y)); 
    17     if (y>=m*2) return(dfs(x,0));  //判断是否瞬移 
    18     if (b[x][y]||a[x%n][y%m]) return 0;  //不能访问
    19     if (c[x%n][y%m]) return 1;  //到达其他起点
    20     b[x][y]=1;
    21     c[x%n][y%m]=1;
    22     for (int i=1;i<=4;i++)
    23       if (dfs(x+dx[i],y+dy[i])) return 1;  //继续搜
    24     return 0;
    25 }
    26 
    27 int main()
    28 {
    29     while (cin>>n>>m)  //多组数据
    30     {
    31         memset(a,0,sizeof(a));
    32         memset(b,0,sizeof(b));
    33         memset(c,0,sizeof(c));
    34         for (int i=0;i<n;i++)
    35          for (int j=0;j<m;j++)
    36          {
    37             cin>>ch;
    38             if (ch=='#') a[i][j]=1;
    39             if (ch=='S')
    40             {
    41                 sx=i;
    42                 sy=j;
    43             }
    44          }
    45         if (dfs(sx,sy)) printf("Yes\n");
    46          else printf("No\n");
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    jdbc-------JDBCUtil类 工具类
    jdbc --- javabean
    MapReduce 找出共同好友
    mapReducer 去重副的单词
    用户定义的java计数器
    mapReducer第一个例子WordCount
    win10 Java环境变量,hadoop 环境变量
    Writable序列化
    io 流操作hdfs
    [常用命令]OSX命令
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9319723.html
Copyright © 2020-2023  润新知