象棋中马的跳法

请同学们自行搜索或者想象一个象棋的棋盘,然后把整个棋盘放入第一象限,棋盘的最左下 角是(0,0)位置。那么整个棋盘就是横坐标上9条线、纵坐标上10条线的一个区域。给你三个参数,x,y,k,返回如果“马”从(0,0)位置出发,必须走k步,最后落在(x,y)上的方法数有多少种?

输入描述:

输入一行数字,包含3个参数x,y,k

输出描述:

输出一个数,代表有几种

示例1

输入

7 7 10

输出

515813

暴力递归:

棋盘上 ( x , y ) 上的马有下面 8 不同的跳法:

象棋中马的跳法

import java.util.Scanner;

//象棋中马的跳法
public class ChineseChess {
	public static int ways1(int x,int y,int k) {
		if(x<0||x>8||y<0||y>9||k<1)return 0;
		return getWays(0,0,k,x,y);
	}
	public static int getWays(int x,int y,int step,int a,int b) {
		//x,y:可变参数,现在所在的位置  step:剩余的步数  a,b:固定参数,终点位置
		//越界
		if(x<0||x>8||y<0||y>9)return 0;
		if(step==0) {//剩余0步
			return x==a&&y==b?1:0;
		}
		//共有八种可以跳的位置
		return getWays(x+1,y+2,step-1,a,b)+
				getWays(x+2,y+1,step-1,a,b)+
				getWays(x+2,y-1,step-1,a,b)+
				getWays(x+1,y-2,step-1,a,b)+
				getWays(x-1,y-2,step-1,a,b)+
				getWays(x-2,y-1,step-1,a,b)+
				getWays(x-2,y+1,step-1,a,b)+
				getWays(x-1,y+2,step-1,a,b);
	}
	public static void main(String[] args) {
		int x,y,k;
		Scanner scan=new Scanner(System.in);
		x=scan.nextInt();
		y=scan.nextInt();
		k=scan.nextInt();
		int ans1,ans2;
		ans1=ways1(x,y,k);
		System.out.println(ans1);
	}
}

象棋中马的跳法

动态规划:

可变参数有 x 、y 、 step 共有3个,因此建立一张三维表
其中,x : 0 ~ 8 ; y : 0 ~ 9 ; step : 0 ~ k。

初始化
step=0,也即第0层所在的二维表,只有(a,b)值为1,其余均为0。

对于普通位置,同时关联其下一层的8个格子,但是要判断是否越界

return getWays(x+1,y+2,step-1,a,b)+
				getWays(x+2,y+1,step-1,a,b)+
				getWays(x+2,y-1,step-1,a,b)+
				getWays(x+1,y-2,step-1,a,b)+
				getWays(x-1,y-2,step-1,a,b)+
				getWays(x-2,y-1,step-1,a,b)+
				getWays(x-2,y+1,step-1,a,b)+
				getWays(x-1,y+2,step-1,a,b);
import java.util.Scanner;

//象棋中马的跳法
public class ChineseChess {
	public static int waysDP(int a,int b,int step) {
		int[][][] dp=new int[9][10][step+1];
		dp[a][b][0]=1;
		for(int h=1;h<=step;++h) {
			for(int x=0;x<=8;++x) {
				for(int y=0;y<=9;++y) {
					dp[x][y][h]=getValue(dp,x+1,y+2,h-1)+
							getValue(dp,x+2,y+1,h-1)+
							getValue(dp,x+2,y-1,h-1)+
							getValue(dp,x+1,y-2,h-1)+
							getValue(dp,x-1,y-2,h-1)+
							getValue(dp,x-2,y-1,h-1)+
							getValue(dp,x-2,y+1,h-1)+
							getValue(dp,x-1,y+2,h-1);
				}
			}
		}
		
		return dp[0][0][step];
	}
	public static int getValue(int[][][] dp,int x,int y,int step) {
		if(x<0||x>8||y<0||y>9)return 0;
		return dp[x][y][step];
	}
	public static void main(String[] args) {
		int x,y,k;
		Scanner scan=new Scanner(System.in);
		x=scan.nextInt();
		y=scan.nextInt();
		k=scan.nextInt();
		int ans2;
		ans2=waysDP(x,y,k);
		System.out.println(ans2);
	}
}

象棋中马的跳法

上一篇:吞吐量(TPS)、QPS、并发数、响应时间(RT)概念


下一篇:django-关系映射