当前位置:首页 > 洛谷 > 洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

5个月前 (06-30)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)  BFS算法 算法优化 C++代码 广度优先搜索 第1张

一、题目解读

洛谷1363题要求判断在给定大小的循环迷宫中,从起点出发是否可以通过移动到达多个不同的路径方向。迷宫由字符矩阵表示,'S'为起点,'#'为障碍物,其余为可通行区域。由于迷宫存在循环(即超出边界后从另一侧重新进入),需判断是否存在多条有效路径,避免陷入无限循环。

二、解题思路

核心思路为广度优先搜索BFS)结合虚拟坐标。普通BFS无法处理循环迷宫中的路径重复问题,因此引入虚拟坐标(virtX, virtY)记录每个位置的“相对位移”。每当到达新节点时,若其虚拟坐标与已访问节点不同,说明存在多条路径,即可判定可逃脱。

三、解题步骤

1. 初始化:读取迷宫矩阵,定位起点(startX, startY),初始化队列和访问标记。

2. BFS遍历:从起点开始,依次遍历上、下、左、右四个方向。

3. 边界处理:使用取模运算实现循环边界(如nx = (x + dx + n) % n),确保坐标合法。

4. 虚拟坐标更新:每次移动时,虚拟坐标根据相对位移计算(vx = virtX[x][y] + dx)。

5. 关键判断:若新节点未被访问,标记并加入队列;若已被访问且虚拟坐标不同,直接返回True(可逃脱)。

6. 终止条件:队列为空时仍未找到不同路径,则返回False。

四、代码与注释

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

const int N = 1505;
char grid[N][N];
bool vis[N][N];
int virtX[N][N], virtY[N][N];
int n, m, startX, startY;
int dirs[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};

bool canEscape() {
    queue<pair<int,int>> q;
    q.push({startX, startY});
    vis[startX][startY] = true;
    virtX[startX][startY] = startX; // 初始化虚拟坐标
    virtY[startX][startY] = startY;

    while (!q.empty()) {
        auto [x,y] = q.front(); q.pop();
        
        for (auto [dx,dy] : dirs) {
            int nx = (x + dx + n) % n; // 循环边界处理
            int ny = (y + dy + m) % m;
            int vx = virtX[x][y] + dx; // 更新虚拟坐标
            int vy = virtY[x][y] + dy;

            if (grid[nx][ny] == '#') continue; // 障碍物跳过

            if (!vis[nx][ny]) { // 未访问节点
                vis[nx][ny] = true;
                virtX[nx][ny] = vx;
                virtY[nx][ny] = vy;
                q.push({nx, ny});
            } 
            else if (virtX[nx][ny]!= vx || virtY[nx][ny]!= vy) { // 关键判断:路径方向不同
                return true; // 存在多条路径,可逃脱
            }
        }
    }
    return false; // 未找到不同路径
}

int main() {
    while (cin >> n >> m) {
        memset(vis, 0, sizeof(vis));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cin >> grid[i][j];
                if (grid[i][j] == 'S') {
                    startX = i; startY = j;
                }
            }
        }
        cout << (canEscape()? "Yes" : "No") << endl;
    }
    return 0;
}

五、总结

本解法通过虚拟坐标巧妙解决循环迷宫的路径多样性问题,避免了传统BFS在循环结构中的冗余判断。核心在于利用相对位移记录路径方向,通过对比虚拟坐标快速确定是否存在多条有效路径,从而优化算法逻辑。该思路对处理类似循环问题具有通用性,是算法设计与优化的典型范例。


原创内容 转载请注明出处

分享给朋友:

相关文章

洛谷P2346四子连珠游戏最短步数BFS解法详解

洛谷P2346四子连珠游戏最短步数BFS解法详解

一、题目解读洛谷P2346是一道经典的棋盘游戏问题,要求在一4x4黑白棋棋盘上,通过移动棋子使同色棋子形成四子一线(横、竖或对角线),计算达成目标所需的最少步数。题目考察BFS算法应用和状态空间搜索能...

力扣面试16.18题解析:模式匹配问题的算法优化与实现(动态规划+字符串匹配)

力扣面试16.18题解析:模式匹配问题的算法优化与实现(动态规划+字符串匹配)

一、题目解读力扣面试16.18题要求判断字符串value是否可通过替换模式串pattern中的字符"a"和"b"(任意非空子串)进行匹配。例如,模式"...

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

牛客13279题解:基于广度优先搜索(BFS)计算树高度的算法优化与代码实现

牛客13279题解:基于广度优先搜索(BFS)计算树高度的算法优化与代码实现

一、题目解读牛客13279题要求计算给定树的高度。树由n个节点组成,通过n-1条边连接,形成一棵有根树。题目核心在于高效求解树的高度,即从根节点到最深叶子节点的最长路径长度。需要理解树的结构特点,选择...

洛谷P1126机器人移动问题:基于BFS算法的解题方案与代码

洛谷P1126机器人移动问题:基于BFS算法的解题方案与代码

一、题目解读洛谷P1126题要求解决一个机器人移动问题:在一个n×m的网格中,机器人占用相邻的4个格子,初始位置和方向已知,需通过左转、右转、前进1-3步的指令到达终点。题目需判断是否存在路径,并输出...

牛客25438题解析:机器人移动可达点数量的BFS算法优化

牛客25438题解析:机器人移动可达点数量的BFS算法优化

一、题目解读牛客25438题要求计算在一个m行n列的网格中,从原点(0,0)出发,每次只能向上、下、左、右移动一步,且移动后的坐标各位数字之和不超过k的情况下,可达点的总数。题目考察对BFS(广度优先...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。