class Solution {

public:
int snakesAndLadders(vector<vector<int>>& board) {
unordered_map<int, pair<int, int>> points;
int n2 = board.size()*board[0].size();
int number = 1;
int count = 0;

for(int i = board.size() -1 ; i >= 0; i--) {
int is_odd = (count++%2) ? 1: 0;
for(int j = 0; j < board.size(); j++) {
points[number++] = {i, abs((int)(board.size() - 1)*is_odd - j)};
}
}

vector<int> check(n2,0);
queue<pair<int, int>> q;
q.push({1, 0});

while(!q.empty()) {
auto [num, count] = q.front();
q.pop();
for(int i = 1; i <= 6 && i + count <= n2 ; i++) {
int new_num = num + i;
int y = points[new_num].first;
int x = points[new_num].second;
new_num = (board[y][x] == -1)? new_num : board[y][x];
if(new_num == n2) {
return count + 1;
}
if(!check[new_num]) {
q.push({new_num, count+1});
check[new_num] = 1;
}
}
}

return -1;
}
};