LeetCode 909 蛇梯棋[BFS] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 909 蛇梯棋[BFS] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

在这里插入图片描述在这里插入图片描述
解题思路:
这几天通过每日一题做有关BFS的题目,逐渐摸索出经验来了,其实对于在一个图中通过多少步数到达终点,套路都是一样的,无论他是根据什么条件进行移动的,都是状态转移的过程,相同状态代表着位置处于同一步数,那么大致思路无非是队列保存相同状态,遍历相同状态得到下一状态,如果下一状态位置未访问继续放入队列中,直到到达目的地或者队列为空,本题思路也同样如此,只不过有些细节需要注意,思路如下:

  1. 定义长度len和N,方便函数使用;
  2. 定义获取下一状态的函数,在该函数中,首先要将序号转变为二维数组中表示的位置,即需要获取行列,根据行列判断是否是蛇或者梯子或者啥也没有,放入数组中,该数组表示存储当前index所能到达的下一状态位置的集合;
  3. 运行函数中初始化队列和访问数组(不设置的话会超时),遍历当前队列中所有的位置(都处于同一状态),调用2中的函数获得下一状态的所有位置,如果是目的位置返回当前步数,不是则放入队列中;
  4. 所有状态遍历后一定有能到达目的地的状态,以及每次访问过的位置都要放入访问数组中。

注释非常详尽,代码如下:

class Solution {
private:
    // 定义长,数量,访问数组
    int len, N;
    unordered_set<int> visited;
public:
    int snakesAndLadders(vector<vector<int>>& board) {
        // 初始化长和数量
        len = board.size();
        N = len * len;
        // 定义队列和初始化访问数组
        queue<int> q;
        // 把初始状态放进去
        visited.insert(1);
        q.push(1);
        int step = 0;
        while(!q.empty()) {
            step ++;
            int l = q.size();
            // 遍历同一步数的所有状态
            for(int i = 0; i < l; i ++) {
                int index = q.front();
                q.pop();
                vector<int> res = getNext(index, board);
                for(int& r : res) {
                    // 不能是经历过的状态
                    if(!visited.count(r)) {
                        if(r == N) {
                            return step;
                        }
                        q.push(r);
                        // move可以改善性能
                        visited.insert(move(r));
                    }
                }
            }
        }
        // 没啥用,最后一定能到终点
        return -1;
    }

    vector<int> getNext(int index, vector<vector<int>>& board) {
        vector<int> res;
        for(int i = index + 1; i <= N && i <= index + 6; i ++) {
            int row = 0, col;
            int num = N;
            // 将index先转换为board表示形式
            while(num >= i) {
                num -= len;
                row ++;
            }
            row --;
            // 如果在偶数行
            if((len - row) % 2 == 0) {
                col = len - (i - 1) % len - 1; 
            } else {// 如果在奇数行
                col = (i - 1) % len;
            }
            // 根据条件放入res中
            if(board[row][col] != -1) {
                res.push_back(board[row][col]);
            } else {
                res.push_back(i);
            }
        }
        return res;
    }
};


/*作者:heroding
链接:https://leetcode-cn.com/problems/snakes-and-ladders/solution/c-bfs-zui-xiang-xi-si-lu-by-heroding-4kyf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

以上是关于LeetCode 909 蛇梯棋[BFS] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

BFS经典面试题——C++版

蛇梯棋(转载)

leetcode909. Snakes and Ladders

BFS问题-LeetCode 55455297127433434(BFS)

Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)

leetcode 130 Surrounded Regions(BFS)