洛谷P1002 过河卒 JAVA

听说大家都用动态规划来解决,我不懂动态规划,用了类似斐波那契数列的办法,因为只能向右或向下移动,所以到(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,截图留念
洛谷P1002 过河卒 JAVA_第1张图片

你可能感兴趣的:(洛谷)