【模拟】【数组】
2596. 检查骑士巡视方案
有一个 n * n
大小的整数矩阵 grid
,矩阵内整数范围为 [0, n * n - 1]
,grid[i][j]
表示单元格 (i, j)
是骑士访问的第 grid[i][j]
个单元格。骑士对单元格的访问是从 (0, 0)
开始的。骑士的有效行动有两种,一种是在水平方向移动两个格子并且竖直方向移动一个格子,另一种是水平方向移动两个格子并且竖直方向移动一个格子。请你判断矩阵 grid
是否表示了骑士的有效行动方案,如果是返回 true
,否则返回 false
。
grid[i][j]
表示单元格 (i, j)
是骑士访问的第 grid[i][j]
个单元格,我们可以先按照访问从前到后的顺序记录一下骑士访问的单元格,然后进行判断:
因为骑士需要从 (0, 0)
位置开始行动,所以如果访问的第一个单元格,不是从 (0, 0)
位置出发的,直接返回 false
;
接下来任意两次相邻行动到达的单元格一定要满足:
以上两个条件可以简化为 d x 2 + d y 2 = 5 dx^2 + dy^2 = 5 dx2+dy2=5,其中 dx
表示两次相邻行动到达的单元格水平方向上的差值,dy
表示竖直方向上的差值;如果 d x 2 + d y 2 ≠ 5 dx^2 + dy^2 \not= 5 dx2+dy2=5,直接返回 fasle
;
其他情况返回 true
;
具体实现中,可以使用一个二维数组 pos
记录骑士按顺序到达的位置。
实现代码
class Solution {
public:
bool checkValidGrid(vector<vector<int>>& grid) {
int n = grid.size();
vector<vector<int>> pos(n*n, vector<int>(2));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
pos[grid[i][j]][0] = i;
pos[grid[i][j]][1] = j;
}
}
if (pos[0][0] != 0 || pos[0][1] != 0) return false;
for (int i = 0; i < n*n - 1; ++i) {
int dx = abs(pos[i+1][0] - pos[i][0]);
int dy = abs(pos[i+1][1] - pos[i][1]);
if ((dx*dx + dy*dy) != 5) return false;
}
return true;
}
};
复杂度分析
时间复杂度: O ( n 2 ) O(n^2) O(n2), n n n 为矩阵的长度(宽度)。
空间复杂度: O ( n 2 ) O(n^2) O(n2),使用的额外空间为记录骑士按顺序到达的位置矩阵。
如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 。
如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。
最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 哦。