小乐乐下象棋

小乐乐下象棋

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

猜你喜欢

转载自www.cnblogs.com/Fighting-sh/p/10050348.html