ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

动态规划——马儿跳

2021-11-06 00:01:16  阅读:249  来源: 互联网

标签:direction int curX ---- ans 马儿 动态 规划 dp


/*
马儿跳问题
马走日
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 TestHoursJump(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))
}

标签:direction,int,curX,----,ans,马儿,动态,规划,dp
来源: https://blog.csdn.net/dawnto/article/details/121172944

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有