LeetCode 909 蛇梯棋[BFS] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 909 蛇梯棋[BFS] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
这几天通过每日一题做有关BFS的题目,逐渐摸索出经验来了,其实对于在一个图中通过多少步数到达终点,套路都是一样的,无论他是根据什么条件进行移动的,都是状态转移的过程,相同状态代表着位置处于同一步数,那么大致思路无非是队列保存相同状态,遍历相同状态得到下一状态,如果下一状态位置未访问继续放入队列中,直到到达目的地或者队列为空,本题思路也同样如此,只不过有些细节需要注意,思路如下:
- 定义长度len和N,方便函数使用;
- 定义获取下一状态的函数,在该函数中,首先要将序号转变为二维数组中表示的位置,即需要获取行列,根据行列判断是否是蛇或者梯子或者啥也没有,放入数组中,该数组表示存储当前index所能到达的下一状态位置的集合;
- 运行函数中初始化队列和访问数组(不设置的话会超时),遍历当前队列中所有的位置(都处于同一状态),调用2中的函数获得下一状态的所有位置,如果是目的位置返回当前步数,不是则放入队列中;
- 所有状态遍历后一定有能到达目的地的状态,以及每次访问过的位置都要放入访问数组中。
注释非常详尽,代码如下:
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之路的主要内容,如果未能解决你的问题,请参考以下文章
leetcode909. Snakes and Ladders
BFS问题-LeetCode 55455297127433434(BFS)