牛客 小乐乐下象棋

链接: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


这道题我最初的思路就是dp,写完了以后看了一下别的老哥的代码,发现他们不少人都是用的搜索。。。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 const int MOD = 1000000007;
 6 const int maxn = 205;
 7 const int dir[][2] = {1,2, 2,1, 2,-1, 1,-2, -2,-1, -1,-2, -1,2, -2,1};
 8 int dp[2][maxn][maxn];
 9 int main(){
10     int n, m, k;
11     while(scanf("%d%d%d",&n,&m,&k)!=EOF){
12         memset(dp,0,sizeof(dp));
13         dp[0][0][0] = 1ll;
14         for(int i=1;i<=k;i++){
15             memset(dp[i&1],0,sizeof(dp[i&1]));
16             for(int x=0;x<n;x++)
17             for(int y=0;y<m;y++)
18             for(int j=0;j<8;j++){
19                 int xx = x+dir[j][0], yy = y+dir[j][1];
20                 if(xx>=0&&xx<n&&yy>=0&&yy<m)
21                     dp[i&1][xx][yy] = (dp[i&1][xx][yy]+dp[(i-1)&1][x][y])%MOD;
22             }
23         }
24         printf("%d\n",dp[k&1][n-1][m-1]);
25     }
26 
27     return 0;
28 }
View Code


猜你喜欢

转载自www.cnblogs.com/kongbb/p/10067365.html