题目链接:https://leetcode.cn/problems/check-knight-tour-configuration/
题目大意:给出一个网格grid[][]
,表示一个骑士在第grid[i][j]
步时的位置是坐标(i, j)
。网格n*n
,下标从0
开始。骑士的起始位置为(0, 0)
,骑士能走的方式同国际象棋中的马(一个方向走1,一个方向走2)。判断这个grid[][]
是否合法,且能遍历网格中所有点刚好1次。
思路:开始题目没看懂,主要是grid[][]
的含义没搞清楚。起初不知道怎么下手,毕竟判断【刚好都走过一次】有点麻烦。但看了题解后发现,题目保证给出的grid[][]
元素是unique的,因此要做的就只有【判断是否合法了】。题目一下子变得简单起来,模拟就行了。
先遍历grid[][]
得到骑士每一步的坐标,放入arr[]
中
int N = grid.size();
pair<int, int> df(-1, -1);
vector<pair<int, int>> arr(N*N, df);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
arr[grid[i][j]] = make_pair(i, j);
}
}
再按顺序遍历arr[]
,看前后的位移是否满足骑士的走法即可
for (int i = 0; i < arr.size()-1; i++) {
int dx = abs(arr[i+1].first - arr[i].first);
int dy = abs(arr[i+1].second - arr[i].second);
if ((dx == 1 && dy == 2) || (dy == 1 && dx == 2))
continue;
return false;
}
完整代码
class Solution {
public:
bool checkValidGrid(vector<vector<int>>& grid) {
if (grid[0][0] != 0)
return false;
int N = grid.size();
pair<int, int> df(-1, -1);
vector<pair<int, int>> arr(N*N, df);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
arr[grid[i][j]] = make_pair(i, j);
}
}
for (int i = 0; i < arr.size()-1; i++) {
int dx = abs(arr[i+1].first - arr[i].first);
int dy = abs(arr[i+1].second - arr[i].second);
if ((dx == 1 && dy == 2) || (dy == 1 && dx == 2))
continue;
return false;
}
return true;
}
};