目录
题目:
示例:
分析:
题目给我们一个n*n大小的矩阵,矩阵的元素表示骑士已经行动的次数,问我们骑士能不能按照矩阵里元素顺序来巡视整个矩阵。
骑士每次移动的方案有八种,类似于中国象棋里的马走日。
骑士在左右和上下两种方向之中,每次移动都是先移动一种方向两格,再移动另一个方向一格,那么每次移动的点是固定的八个点,因此我们只需要在这八个点中寻找元素等于当前所在格子的元素+1的位置,如果找不到,那么就表示骑士无法按照矩阵中的顺序去巡视。
我们使用递归去寻找每个点,题目有说一开始骑士在左上角,因此我们从左上角开始递归,我们不断按照上诉的过程递归,直到我们把矩阵中所有格子都走一遍了,也就是递归了n*n+1次,那么表示骑士可以按照矩阵的顺序去巡视,我们返回true即可。
代码:
cpp
class Solution {
public:
bool find(vector<vector<int>>&grid,int n,int i,int j,int index){
if(index==n*n) return true; //走完了整个棋盘
if(i<0||j<0||i>=n||j>=n||grid[i][j]!=index) return false;
//向八个方向试探
if(find(grid,n,i+1,j+2,index+1)) return true;
if(find(grid,n,i+1,j-2,index+1)) return true;
if(find(grid,n,i+2,j+1,index+1)) return true;
if(find(grid,n,i+2,j-1,index+1)) return true;
if(find(grid,n,i-2,j+1,index+1)) return true;
if(find(grid,n,i-2,j-1,index+1)) return true;
if(find(grid,n,i-1,j+2,index+1)) return true;
if(find(grid,n,i-1,j-2,index+1)) return true;
return false;
}
bool checkValidGrid(vector<vector<int>>& grid) {
return find(grid,grid.size(),0,0,0);
}
};