NC21560. 小乐乐下象棋
描述
输入描述
输入:多组样例输入,每组一行,三个整数n, m, k(1 <= n, m, k <= 200),如题目所示。
输出描述
输出:输出答案 mod 1000000007
示例1
输入:
4 4 2
输出:
2
C++14(g++5.4) 解法, 执行用时: 1075ms, 内存消耗: 32632K, 提交时间: 2020-08-19 11:00:16
#include<bits/stdc++.h> using namespace std; const int N = 202 , mod = 1000000007; int dp[N][N][N]; int dx[]={1,1,-1,-1,2,2,-2,-2}; int dy[]={2,-2,2,-2,1,-1,1,-1}; int n,m,K; signed main(){ while(cin>>n>>m>>K){ memset(dp,0,sizeof(dp)); dp[0][0][0]=1; for(int k=1;k<=K;k++){ for(int x=0;x<n;x++){ for(int y=0;y<m;y++){ for(int i=0;i<8;i++){ if(dp[x][y][k-1]!=0){ int tx=dx[i]+x; int ty=dy[i]+y; if(tx>=0&&ty>=0&&tx<n&&ty<m){ dp[tx][ty][k]=(dp[x][y][k-1]+dp[tx][ty][k])%mod; } } } } } } cout<<dp[n-1][m-1][K]%mod<<'\n'; } return 0; } /* 4 4 2 4 4 2 */
C++11(clang++ 3.9) 解法, 执行用时: 1517ms, 内存消耗: 40940K, 提交时间: 2020-03-16 20:43:27
#include<bits/stdc++.h> const int dir[][2]={{1,2},{-1,2},{1,-2},{-1,-2},{2,1},{-2,1},{2,-1},{-2,-1}}; int dp[218][218][218]; const int mod=1000000007; int main() { int n,m,K; int i,j,k,l; while(~scanf("%d%d%d",&n,&m,&K)) { memset(dp,0,sizeof(dp)); dp[0][0][0]=1; for(k=1;k<=K;k++) for(i=0;i<n;i++) for(j=0;j<m;j++) for(l=0;l<8;l++) { int x=i-dir[l][0]; int y=j-dir[l][1]; if(x>=0&&x<n&&y>=0&&y<m) dp[i][j][k]=(dp[i][j][k]+dp[x][y][k-1])%mod; } printf("%d\n",dp[n-1][m-1][K]); } return 0; }