听说大家都用动态规划来解决,我不懂动态规划,用了类似斐波那契数列的办法,因为只能向右或向下移动,所以到(i,j)的路径 ans[i][j]=ans[i-1][j]+ans[i][j-1]。
话不多说直接贴上代码
package demo;
import java.util.Scanner;
class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n,m,x,y;
n = scan.nextInt();
m = scan.nextInt();
x = scan.nextInt();
y = scan.nextInt();
int[][] map = new int [21][21];
long[][] ans = new long [21][21];
int[][] horse = {{-2,1},{-2,-1},{2,1},{2,-1},{-1,2},{-1,-2},{1,2},{1,-2}};
map[x][y]=1;
for(int i=0; i<8; i++) { //马周围的控制点,不越界则设置为1
if((x+horse[i][0])>=0 && x+horse[i][0]<=n && y+horse[i][1]>=0 && y+horse[i][1]<=m)
map[x+horse[i][0]][y+horse[i][1]]=1;
}
int k=0;
for(int i=0; i<=m; i++) { //设置第一行初值
if(k==1)
ans[0][i]=0;
else
if(map[0][i]==1) {
k=1;
ans[0][i]=0;
}
else
ans[0][i]=1;
}
k=0;
for(int i=0; i<=n; i++) { //设置第一列初值
if(k==1)
ans[i][0]=0;
else
if(map[i][0]==1) {
k=1;
ans[i][0]=0;
}
else
ans[i][0]=1;
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(map[i][j]==0)
ans[i][j]=ans[i-1][j]+ans[i][j-1];
else
ans[i][j]=0;
}
}
System.out.println(ans[n][m]);
}
}
一开始测试结果跟实际结果不是少1就是少2,后来发现是设置行列初值时忘记了 i=m和i=n的情况。一个多小时才ac,截图留念