小乐乐下象棋

题目描述

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

题意

  中文题意,不做解释。

分析

  数据范围200,直接暴力枚举就可以了。dp[i][x][y]表示在第i步到达(x,y)点的方案。

///  author:Kissheart  ///
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<vector>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<deque>
#include<ctype.h>
#include<map>
#include<set>
#include<stack>
#include<string>
#define INF 0x3f3f3f3f
#define FAST_IO ios::sync_with_stdio(false)
const double PI = acos(-1.0);
const double eps = 1e-6;
const int MAX=1e5+10;
const int mod=1e9+7;
typedef long long ll;
using namespace std;
#define gcd(a,b) __gcd(a,b)
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;}
inline ll inv1(ll b){return qpow(b,mod-2);}
inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;}
inline ll read(){ll x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;}
//freopen( "in.txt" , "r" , stdin );
//freopen( "data.txt" , "w" , stdout );
int n,m,k;
ll dp[205][205][205];
int dir[8][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
int main()
{
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        memset(dp,0,sizeof(dp));
        dp[0][1][1]=1;
        for(int i=1;i<=k;i++)
        {
            for(int x=1;x<=n;x++)
            {
                for(int y=1;y<=m;y++)
                {
                    for(int p=0;p<8;p++)
                    {
                        int fx=x+dir[p][0];
                        int fy=y+dir[p][1];
                        if(fx>=1 && fy>=1 && fx<=n && fy<=m)
                            dp[i][fx][fy]=(dp[i][fx][fy]%mod+dp[i-1][x][y]%mod)%mod;
                    }
                }
            }
        }
        printf("%lld
",dp[k][n][m]%mod);
    }
    return 0;
}
View Code

  

原文地址:https://www.cnblogs.com/Kissheart/p/10062837.html