骑士游历

来源:互联网 发布:如何编写python程序 编辑:程序博客网 时间:2024/04/18 16:45
#1504 : 骑士游历
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
在8x8的国际象棋棋盘上给定一只骑士(俗称“马”)棋子的位置(R, C),小Hi想知道从(R, C)开始移动N步一共有多少种不同的走法。  


输入
第一行包含三个整数,N,R和C。


对于40%的数据, 1 <= N <= 1000000


对于100%的数据, 1 <= N <= 1000000000 1 <= R, C <= 8


输出
从(R, C)开始走N步有多少种不同的走法。由于答案可能非常大,你只需要输出答案模1000000007的余数。


样例输入
2 1 1
样例输出

12


一个通俗的想法:f[k][i][j],第k步可以到达(i,j)的步法总数。
f[k+1][i][j]是在第k步的基础上走1步到达(i,j)的步法总数。


import java.util.Scanner;public class Main {static long[][][] data=new long[2][12][12];static int[] dx=new int[]{-2,-2,-1,-1,1,1,2,2};static int[] dy=new int[]{-1,1,-2,2,-2,2,-1,1};static int pre=0,cur=0;static int mod=1000000007;public static void main(String[] args) {Scanner sc=new Scanner(System.in);while(sc.hasNext()){int n=sc.nextInt();int r=sc.nextInt();int c=sc.nextInt();data[0][r][c]=1;pre=0;cur=1;for (int step = 1; step <= n; step++) {for (int i = 1; i <= 8; i++) {for (int j = 1; j <= 8; j++) {data[cur][i][j]=0;}}for (int i = 1; i <= 8; i++) {for (int j = 1; j <= 8; j++) {//八个方向for (int f = 0; f < 8; f++) {int x=i+dx[f];int y=j+dy[f];if(x>=1 && x<=8 && y>=1 && y<=8)data[cur][x][y]=(data[cur][x][y]+data[pre][i][j])%mod;}}}pre=pre^1;cur=cur^1;}long ans=0;for (int i = 1; i <= 8; i++) {for (int j = 1; j < 8; j++) {ans=(ans+data[pre][i][j])%mod;}}System.out.println(ans);}}}


0 0