请同学们自行搜索或者想象一个象棋的棋盘,然后把整个棋盘放入第一象限,棋盘的最左下 角是(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);
}
}