跳马问题

49. 跳马问题

★   输入文件: horse.in   输出文件: horse.out    简单对比
时间限制:1 s   内存限制:128 MB

问题描述

有一只中国象棋中的 “ 马 ” ,在半张棋盘的左上角出发,向右下角跳去。规定只许向右跳(可上,可下, 但不允许向左跳)。请编程求从起点 A(1,1) 到终点 B(m,n) 共有多少种不同跳法。
【输入格式】
输入文件只有一行,两个整数m和n,两个数之间有一个空格。
【输出格式】
输出文件只有一个数据,即从 A 到 B 全部的走法
【输入输出样例】
输入文件(horse.in)
5 9
输出文件(horse.out)
37

简单dp。dp[m][n]表示 到达 (m,n)这个点的走法,容易知道只有四个点,可以到达(m,n)这个点。

下面是AC代码:
#include<cstdio>
#include<cstring>
using namespace std;
int dp[110][110];
int m,n;
int solve(int i,int j){
    if(i<1||j<1||i>m||j>n) return 0;
    if(i==1&&j==1) return 1;
    if(dp[i][j]>0)  return dp[i][j];
    dp[i][j]=solve(i-2,j-1)+solve(i+2,j-1)+solve(i-1,j-2)+solve(i+1,j-2);
    return dp[i][j];
}
int main(){
    freopen("horse.in","r",stdin);
    freopen("horse.out","w",stdout);
    while(scanf("%d%d",&m,&n)!=EOF){
        memset(dp,0,sizeof(dp));
       printf("%d\n",solve(m,n));
    }
    return 0;
}



你可能感兴趣的:(编程,IM)