洛谷 过河卒 p1002 题解

其实这道题如果你会递推,搞清楚问题的本质就很简单了

首先我们要知道加法原理,加法原理是什么呢?举个栗子:如果我们去上海只可以坐火车,坐飞机。而火车有n班次,飞机有m班次。那么总共去上海就有(n+m)种方式。

之后,我们就可以推出这个题目的递推表达式:

(ps:我们用f(x)(y)的形式来表示到达点(x,y)的步数。而且设g(n)(m)=1为马的的位置,那么马可能走到的位置(包括马的初始位置)为:)

> g[n][m];
    g[n-2][m+1];
    g[n-1][m+2];
    g[n-2][m-1];
    g[n-1][m-2];
    g[n+1][m-2];
    g[n+2][m-1];
    g[n+2][m+1];
    g[n+1][m+2]; 

1.如果终点在马的控制点(即马能走到得位置),毫无疑问步数为02.如果马的终点不在马的控制点上,那么步数就是所有上一步的步数之和,即 f(x)(y)=f(x-1)(y)+f(x)(y-1)(x,y为坐标)。但此处还有两种特殊情况:

  • 一种是刚好x等于0,那么f(x)(y)=f(x)(y-1)(因为马只能向y轴方向移动,所以上一个位置只能为(x,y-1) )

  • 一种是刚好y等于0,那么f(x)(y)=f(x-1)(y)(因为马只能向x轴方向移动,所以上一个位置只能为(x-1,y))

3.最后我们要设置起点f(0)(0)=1;

所以综上,我们可以写出程序

#include <iostream>
#include <cstdio>

using namespace std;

long long map[25][25];
int g[25][25];//g[i][j]==1为马的控制点 

int main(){
    int a,b,n,m;//(a,b)为b的坐标,(n,m)为马的坐标
    cin>>a>>b>>n>>m;
    //马的控制点
    g[n][m]=1;
    g[n-2][m+1]=1;
    g[n-1][m+2]=1;
    g[n-2][m-1]=1;
    g[n-1][m-2]=1;
    g[n+1][m-2]=1;
    g[n+2][m-1]=1;
    g[n+2][m+1]=1;
    g[n+1][m+2]=1; 

    for (int i=0;i<=a;i++){

        for (int j=0;j<=b;j++){

            if (g[i][j]==1){

                map[i][j]=0;

            }else{          //如果不在马的控制点上 

                if (i==0&&j==0){

                    map[i][j]=1;//如果在起点
                    continue;//这个很重要,因为判断出一种结果后就要判断下一位置了

                    } 
                if (i==0) {

                    map[i][j]=map[i][j-1];
                    continue;

                }
                if (j==0){

                    map[i][j]=map[i-1][j]; 
                    continue;

                }

                map[i][j]=map[i][j-1]+map[i-1][j]; 

            } 

        }

    }

    cout<<map[a][b];

    return 0;

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值