动态规划——马儿跳

/*
马儿跳问题
马走日
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))
}
上一篇:JS实现div的拖拉拽


下一篇:2048游戏系列---功能模块第二稿【键盘输入】