列表

详情


NC21560. 小乐乐下象棋

描述

小乐乐一天天就知道玩,这一天又想玩象棋。
我们都知道马走日。
现在给定一个棋盘,大小是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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

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;
}

上一题