中等题
骑士在一张
n x n
的棋盘上巡视。在有效的巡视方案中,骑士会从棋盘的 左上角 出发,并且访问棋盘上的每个格子 恰好一次 。给你一个
n x n
的整数矩阵grid
,由范围[0, n * n - 1]
内的不同整数组成,其中grid[row][col]
表示单元格(row, col)
是骑士访问的第grid[row][col]
个单元格。骑士的行动是从下标 0 开始的。如果
grid
表示了骑士的有效巡视方案,返回true
;否则返回false
。注意,骑士行动时可以垂直移动两个格子且水平移动一个格子,或水平移动两个格子且垂直移动一个格子。下图展示了骑士从某个格子出发可能的八种行动路线。
让骑士在他能走的八个方向一个一个查看是不是下一个走的,num存步数,若退出循环步数<应该走的步数,则巡视方案无效。
class Solution {
public:
bool checkValidGrid(vector<vector<int>>& grid) {
if(grid[0][0]!=0)return false;
int newx,newy;
int num=1;
int i;
int x=0,y=0;
int dx[8] = {-1,-2,-2,-1,1,2,2,1};
int dy[8] = {-2,-1,1,2,-2,-1,1,2};
for(i=0;i<8;i++)
{
newx = x+dx[i];
newy = y+dy[i];
if(newx<0||newx>=grid[0].size()||newy<0||newy>=grid[0].size())continue;
if(grid[newx][newy]!=num)
continue;
else
{
x = newx;
y = newy;
i = -1;
num++;
}
}
if(num<grid[0].size()*grid[0].size())
return false;
return true;
}
};