简单来说,题目就是一个N*N的矩阵中从左上角走到右下角。只能往右或者往下。遇到‘H’不能走。最多转弯K次。共有多少种走法?
用DFS会很简洁明了。我们发现这道题需要记录的是:走到第几行第几列了,转弯次数,和这次转的方向(便于下一次搜索)。所以传进去四个参数:row,col,turn,flag。
接下来搜索向右、向下,向右需要确保没有到最右边一列,向下需要确保没有到最下面一行。接下来,判断进入下次dfs的过程就是在判断:flag==-1(未确定方向), flag==0(右), flag==1(下),三种情况。然后进入下一次搜索。dfs的代码见下。
// flag(-1没确定方向,0代表右,1代表下)
void dfs(int row, int col, int turn, int flag){
if(turn == k && row!=n-1 && col!=n-1) return; //剪枝
if(turn > k) return; //剪枝
if(row==n-1 && col==n-1){cnt++; return;}
// 本轮要往下走
if(row!=n-1 && c[row+1][col]!='H') {
if(flag == -1) dfs(row+1, col,0,1);
else if(flag == 0) dfs(row+1, col, turn+1, 1);
else dfs(row+1, col, turn, 1);
}
if(col!=n-1 && c[row][col+1]!='H'){
if(flag == -1) dfs(row, col+1,0,0);
else if(flag == 0) dfs(row, col+1, turn, 0);
else dfs(row, col+1, turn+1, 0);
}
}