幻想迷宫【DFS】

题目大意:

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

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

Output O u t p u t

Yes
No

思路:

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


这道题要我们求能否走到无限远处,其实很容易想到,它就是要我们求能否从起点到达另一个起点!(因为会瞬移)
图片转自https://www.luogu.org/blog/GNAQ/solution-p1363
这里写图片描述
如果能从粉色的 S S 走到黑色的S,那么就肯定能从黑色的 S S 走到棕色的S,那么也能走到下一个 S S 。。。就能走到无限远处。
那么第一种思路肯定是开一个9×9的矩阵(如上图),一般来说, 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;
}
### Python 实现迷宫深度优先搜索 (DFS) 为了实现迷宫中的深度优先搜索,可以采用栈结构或递归方法。下面展示的是使用递归来遍历迷宫并寻找出路的方法。 #### 定义迷宫 首先定义一个二维列表表示迷宫,其中 `0` 表示可通过的空间而 `1` 则代表墙壁不可通过: ```python maze = [ [1, 1, 1, 1, 1], [1, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 0, 0, 0, 1], [1, 1, 1, 1, 1] ] start_position = (1, 1) end_position = (3, 3) ``` #### DFS 函数设计 接下来创建一个名为 `dfs` 的函数用于执行实际的搜索操作。此函数接收当前坐标作为参数,并返回布尔值指示是否找到了出口路径[^1]。 ```python def dfs(maze, start, end): stack = [(start[0], start[1])] while stack: pos = stack.pop() if pos == end: return True for direction in [(0,-1), (-1,0), (0,1), (1,0)]: next_pos = (pos[0]+direction[0], pos[1]+direction[1]) if is_valid_move(maze, next_pos): maze[next_pos[0]][next_pos[1]] = -1 # Mark as visited stack.append(next_pos) return False def is_valid_move(maze, position): row, col = position rows, cols = len(maze), len(maze[0]) if not(0 <= row < rows and 0 <= col < cols): return False value_at_pos = maze[row][col] if value_at_pos != 0: return False return True ``` 这段代码实现了基本的功能框架,但是还需要一些辅助功能来标记访问过的节点以及判断移动的有效性。这里假设起点和终点都是开放区域(`0`)并且不会位于边界处。 #### 可视化解决方案 一旦完成了上述逻辑部分的工作之后就可以考虑如何直观地显示最终的结果了。一种简单的方式就是再次打印整个迷宫数组,在已经走过的路上留下特殊的标志字符以便区分未探索过的地方和其他状态的位置[^2]。 ```python for i in range(len(maze)): for j in range(len(maze[i])): if maze[i][j]==-1: print('X', end=' ') # Visited path marker elif maze[i][j]==0 or maze[i][j]==1: print({0:' ', 1:'#'}[maze[i][j]], end=' ') print() if dfs(maze, start_position, end_position): print("\nPath found!") else: print("\nNo Path Found.") ``` 以上就是一个完整的Python程序用来模拟迷宫内的深度优先搜索过程。当然这只是一个基础版本,对于更复杂的场景可能需要进一步调整算法细节或是引入额外的数据结构支持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值