问题
蛇梯棋 原题链接:https://leetcode.cn/problems/snakes-and-ladders?envType=study-plan-v2&envId=top-interview-150
解法
本题难度为中等,一看就可以知道思路为BFS,只要做好条件的判断可以自然求出答案。个人在做的过程中,对于奇、偶行的方向判断陷入了困境,拆分了大量不同情况,最后放弃看了答案。看答案后明白答案对行数的判断真的很巧妙。他没有多余的判断,只借助本身的next值,通过numToId函数将值得到具体的行坐标和列坐标,且依据是奇数行还是偶数行(从下往上看)翻转列数保证了正确的顺序。返回时行数也翻转一下,即保证了他原本是从下往上变为从上往下,符合数组的正常顺序。
class Solution { public: pair<int,int> numToId(int next,int n){ int r=(next-1)/n; int c=(next-1)%n; if(r%2==1) c=n-1-c; return {n-r-1,c}; } int snakesAndLadders(vector<vector<int>>& board) { int n=board.size(); queue<pair<int,int>> q; vector<int> vis(n*n+1,0); q.push({1,0}); while(!q.empty()){ auto tempPair=q.front(); q.pop(); for(int i=1;i<7;i++){ int ne=tempPair.first+i,step=tempPair.second; if(ne>n*n) break; auto [r,c]=numToId(ne,n); if(board[r][c]!=-1) ne=board[r][c]; if(ne==n*n) return step+1; if(!vis[ne]){ vis[ne]=1; q.push({ne,step+1}); } } } return -1; } };
|