• 幻想迷宫【DFS】


    题目大意:

    给出一个迷宫,走到这个迷宫边界时可以瞬移。求从S点开始,能否走到无限远。
    Input

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

    Output

    Yes
    No

    思路:

    哇。。。这是我做过的最难得DFS题目。。。
    从5月开始做,陆陆续续地,今天终于做完了。。。
    啊啊啊啊啊累死我了(今天攻了一整天这道题,终于过了。。。)
    不愧是蓝题。
    共耗时:72天8时


    这道题要我们求能否走到无限远处,其实很容易想到,它就是要我们求能否从起点到达另一个起点!(因为会瞬移)
    图片转自https://www.luogu.org/blog/GNAQ/solution-p1363
    这里写图片描述
    如果能从粉色的S走到黑色的S,那么就肯定能从黑色的S走到棕色的S,那么也能走到下一个S。。。就能走到无限远处。
    那么第一种思路肯定是开一个9×9的矩阵(如上图),一般来说,9×9就足够我们存所有答案了。
    但是如果遇到下面这组数据:

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

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


    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int dx[]={0,0,0,1,-1};
    const int dy[]={0,1,-1,0,0};
    int n,m,sx,sy;
    int a[1511][1511],b[3011][3011],c[1511][1511];
    char ch;
    
    int dfs(int x,int y)  //深搜
    {
        if (x<0) return(dfs(n*2-1,y)); 
        if (y<0) return(dfs(x,m*2-1)); 
        if (x>=n*2) return(dfs(0,y)); 
        if (y>=m*2) return(dfs(x,0));  //判断是否瞬移 
        if (b[x][y]||a[x%n][y%m]) return 0;  //不能访问
        if (c[x%n][y%m]) return 1;  //到达其他起点
        b[x][y]=1;
        c[x%n][y%m]=1;
        for (int i=1;i<=4;i++)
          if (dfs(x+dx[i],y+dy[i])) return 1;  //继续搜
        return 0;
    }
    
    int main()
    {
        while (cin>>n>>m)  //多组数据
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            memset(c,0,sizeof(c));
            for (int i=0;i<n;i++)
             for (int j=0;j<m;j++)
             {
                cin>>ch;
                if (ch=='#') a[i][j]=1;
                if (ch=='S')
                {
                    sx=i;
                    sy=j;
                }
             }
            if (dfs(sx,sy)) printf("Yes\n");
             else printf("No\n");
        }
        return 0;
    }
  • 相关阅读:
    Maven 集成Tomcat插件
    dubbo 序列化 问题 属性值 丢失 ArrayList 解决
    docker 中安装 FastDFS 总结
    docker 从容器中拷文件到宿主机器中
    db2 相关命令
    Webphere WAS 启动
    CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题
    SpringMVC JSONP JSON支持
    CKEDITOR 3.4.2中 按钮事件中 动态改变图标和title 获取按钮
    git回退到远程某个版本
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998876.html
Copyright © 2020-2023  润新知