洛谷P1002 过河卒 JAVA

    技术2022-07-10  143

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

    Processed: 0.010, SQL: 9