示例 1:
输入:grid = [[0,11,16,5,20],[17,4,19,10,15],[12,1,8,21,6],[3,18,23,14,9],[24,13,2,7,22]]
输出:true
解释:grid 如上图所示,可以证明这是一个有效的巡视方案。
示例 2:
输入:grid = [[0,3,6],[5,8,1],[2,7,4]]
输出:false
解释:grid 如上图所示,考虑到骑士第 7 次行动后的位置,第 8 次行动是无效的。
提示:
n == grid.length == grid[i].length
3 <= n <= 7
0 <= grid[row][col] < n * n
grid
中的所有整数 互不相同
核心思想:不管怎么走下一步,开始位置和下一步的位置的横坐标和纵坐标的差的积的绝对值为2,如果不为2的话,那么就说明走错了,返回false
if(grid[0][0]!=0){
return false;
}
题目要求从左上角开始,那么首先要有一个判断骑士是否从左上角开始的语句
int n = gridSize;
int arr[n*n][2];
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
arr[grid[i][j]][0] = i;
arr[grid[i][j]][1] = j;
}
}
重新定义了一个数组arr,下标表示第几次跳到的格子,里面所对应的是(x,y)坐标
for(int i = 1;i<n*n;i++){
int x = abs(arr[i][0] - arr[i-1][0]);
int y = abs(arr[i][1] - arr[i-1][1]);
if(x*y!=2){
return false;
}
}
return true;
循环遍历上面定义的数组arr,由上述的arr数组的意义所知,arr[i][0]表示的是第i次被跳到的格子所对应的x坐标,那么arr[i-1][0]就是第i-1次跳到的格子的x坐标,以此算出x,y的差距,然后相乘,如果相乘不等于2的话,说明这个跳的格子有问题,就返回false,将所有坐标都遍历完之后,没有发现不匹配的格子,那么就返回true
完整代码:
bool checkValidGrid(int** grid, int gridSize, int* gridColSize){
if(grid[0][0]!=0){
return false;
}
int n = gridSize;
int arr[n*n][2];
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
arr[grid[i][j]][0] = i;
arr[grid[i][j]][1] = j;
}
}
for(int i = 1;i<n*n;i++){
int x = abs(arr[i][0] - arr[i-1][0]);
int y = abs(arr[i][1] - arr[i-1][1]);
if(x*y!=2){
return false;
}
}
return true;
}