USACO 2021·12 Bronze——Walking Home 题解

简单来说,题目就是一个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);
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值