牛客 小乐乐下象棋
链接: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,把棋盘放在第一象限,棋盘的左下角是(0,0),右上角是(n - 1, m - 1);
小乐乐想知道,一个马从左下角(0, 0)开始,走了k步之后,刚好走到右上角(n - 1, m - 1)的方案数。
输入描述:
输入:多组样例输入,每组一行,三个整数n, m, k(1 <= n, m, k <= 200),如题目所示。
输出描述:
输出:输出答案 mod 1000000007
示例1
输出
复制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 }