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