动态规划——马儿跳

/*
马儿跳问题
马走日
9*10的棋盘,马在左下角, 给定任意一个位置,一个步数k,问,马跳到该点,用k步的方法有多少种
k (x,y)

 */

/*

9  *----*----*----*----*----*----*----*----*
   |    |    |    |  \ | /  |    |    |    |
8  *----*----*----*----*----*----*----*----*
   |    |    |    |  / | \  |    |    |    |
7  *----*----*----*----*----*----*----*----*
   |    |    |    |    |    |    |    |    |
6  *----*----*----*----*----*----*----*----*
   |    |    |    |    |    |    |    |    |
5  *----*----*----*----*----*----*----*----*
   |   楚       河           汉        界   |
4  *----*----*----*----*----*----*----*----*
   |    |    |    |    |    |    |    |    |
3  *----*----*----*----*----*----*----*----*
   |    |    |    |    |    |    |    |    |
2  *----*----*----*----*----*----*----*----*
   |    |    |    |  \ | /  |    |    |    |
1  *----*----*----*----*----*----*----*----*
   |    |    |    |  / | \  |    |    |    |
0  *----*----*----*----*----*----*----*----*
   0    1    2    3    4    5    6    7    8


 */

func HorseJump(targetX, targetY, curX, curY, rest int)  int  {
	if curX < 0 || curX > 9 || curY < 0 || curY > 8 || rest < 0 {
		return 0
	}

	if rest == 0  {
		if curX == targetX && curY == targetY {
			return 1
		}else {
			return 0
		}
	}
	//八个方向
	ans := 0
	for _, direction := range [][]int{{+2,+1},{+1,+2},{-1,+2},{-2,+1},{-2,-1},{-1,-2},{+1,-2},{+2,-1}}{
		ans += HorseJump(targetX, targetY, curX + direction[0], curY+direction[1],rest - 1)
	}
	return ans
}

func HorseJumpForDp(targetX, targetY, k int) int {
	dp := make([][][]int,10)
	for i := range dp {
		dp[i] = make([][]int,9)
		for w := range dp[i] {
			dp[i][w] = make([]int,k+1)
		}
	}

	dp[0][0][0] = 1


   for level := 1; level <= k; level++ {
	  for i := 0; i < 10; i++ {
		   for j := 0; j < 9; j++ {
			   ans := 0
			   for _, direction := range [][]int{{+2,+1},{+1,+2},{-1,+2},{-2,+1},{-2,-1},{-1,-2},{+1,-2},{+2,-1}}{
				 if i + direction[0] < 0 || i + direction[0] > 9 || j+direction[1] < 0 || j+direction[1] > 8 {
					 continue
				 }
				   ans += dp[i + direction[0]][j + direction[1]][level-1]
			   }
			   dp[i][j][level] = ans
		   }
	  }
   }
	return dp[targetX][targetY][k]
}


func TestHorseJump(t *testing.T)  {
	//fmt.Println(HourseJump(3,2,0,0,3))
	fmt.Println(HorseJump(6,8,0,0,10))
	fmt.Println(HorseJumpForDp(6,8,10))
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

metabit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值