private:
std::pair<int, int> id2rc(int id, int n) {
int row = (id - 1) / n;
int column = (id - 1) % n;
if (row % 2 == 1) {
column = n - 1 - column;
}
return {n - 1 - row, column};
}
n - 1 - row 是因为起点是从左下角开始;
因为是左右盘桓,奇偶行的列号发生颠倒;
class Solution {
public:
int snakesAndLadders(vector<vector<int>>& board) {
int n = board.size();
std::vector<int> visited(n * n + 1);
std::queue<std::pair<int, int>> qu;
qu.emplace(1, 0);
while (!qu.empty()) {
auto p = qu.front();
qu.pop();
for (int i = 1; i <= 6; ++i) {
int next = p.first + i;
if (next > n *n) {
break;
}
// update next row & column
auto rc = id2rc(next, n);
// gateway and passthrough to the dst
if (board[rc.first][rc.second] > 0) {
next = board[rc.first][rc.second];
}
// final state
if (next == n * n) {
return p.second + 1;
}
if (!visited[next]) {
visited[next] = true;
qu.emplace(next, p.second + 1);
}
}
}
return -1;
}
private:
std::pair<int, int> id2rc(int id, int n) {
int row = (id - 1) / n;
int column = (id - 1) % n;
if (row % 2 == 1) {
column = n - 1 - column;
}
return {n - 1 - row, column};
}
};