1. 程式人生 > >小樂樂下象棋

小樂樂下象棋

小樂樂下象棋

https://ac.nowcoder.com/acm/contest/301/F

題目描述

小樂樂一天天就知道玩,這一天又想玩象棋。
我們都知道馬走日。
現在給定一個棋盤,大小是n*m,把棋盤放在第一象限,棋盤的左下角是(0,0),右上角是(n - 1, m - 1);
小樂樂想知道,一個馬從左下角(0, 0)開始,走了k步之後,剛好走到右上角(n - 1, m - 1)的方案數。

輸入描述:

輸入:多組樣例輸入,每組一行,三個整數n, m, k(1 <= n, m, k <= 200),如題目所示。

輸出描述:

輸出:輸出答案 mod 1000000007
示例1

輸入

4 4 2

輸出

2


 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 #include<map>
 5 #include<vector>
 6 #include<cmath>
 7 #include<string
.h> 8 #include<stdlib.h> 9 #include<queue> 10 #include<cstdio> 11 #define ll long long 12 const long long MOD=1000000007; 13 using namespace std; 14 15 16 int dir[8][2]={1,2,-1,-2,1,-2,-1,2,2,1,-2,-1,-2,1,2,-1}; 17 int book[205][205][205]; 18 long long n,m,k; 19 long long dfs(int x,int
y,int step){ 20 if(book[x][y][step]!=-1){ 21 return book[x][y][step]; 22 } 23 long long ans=0; 24 for(int i=0;i<8;i++){ 25 int xx=x+dir[i][0]; 26 int yy=y+dir[i][1]; 27 if(xx>=0&&xx<n&&yy>=0&&yy<m&&step<k){ 28 ans=(ans+dfs(xx,yy,step+1))%MOD; 29 } 30 } 31 book[x][y][step]=ans; 32 return ans; 33 } 34 35 int main(){ 36 while(cin>>n>>m>>k){ 37 for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) for(int w=0;w<=k;w++) book[i][j][w]=-1; 38 book[n-1][m-1][k]=1; 39 cout<<dfs(0,0,0)<<endl; 40 } 41 }
View Code