zoukankan      html  css  js  c++  java
  • 洛谷 P1002 过河卒

    洛谷 P1002 过河卒

    题目传送门

    题目描述

    棋盘上AA点有一个过河卒,需要走到目标BB点。卒行走的规则:可以向下、或者向右。同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

    棋盘用坐标表示,AA点(0, 0)(0,0)、BB点(n, m)(n,m)(nn, mm为不超过2020的整数),同样马的位置坐标是需要给出的。

    现在要求你计算出卒从AA点能够到达BB点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

    输入格式

    一行四个数据,分别表示BB点坐标和马的坐标。

    输出格式

    一个数据,表示所有的路径条数。

    输入输出样例

    输入 #1复制

    输出 #1复制

    说明/提示

    结果可能很大!

    题解1:

    这是一道递推的典型题目。

    我们很容易看出来,这道题的转移方程就是dp[i] [j]=dp[i-1] [j]+dp[i] [j-1];

    但是这道题的细节坑死爹。

    首先开long long。

    其次,要多开至少3位的数组。

    为了处理防越界,我们把n,m,x,y都+2.

    最后我们还要特殊处理i= =2和j= =2时候的递推。

    总之就是,60分很容易,100分比较难。

    代码:

    #include<cstdio>
    #define ll long long
    using namespace std;
    ll dp[25][25];
    int n,m,x,y;
    int main()
    {
        scanf("%d%d%d%d",&n,&m,&x,&y);
        n+=2,m+=2,x+=2,y+=2;
        for(int i=2;i<=n;i++)
            for(int j=2;j<=m;j++)
                dp[i][j]=-1;
        dp[x][y]=dp[x-2][y-1]=dp[x-1][y-2]=dp[x-1][y+2]=dp[x-2][y+1]
        =dp[x+1][y-2]=dp[x+1][y+2]=dp[x+2][y-1]=dp[x+2][y+1]=0;
        dp[2][2]=1;
        for(int i=2;i<=n;i++)
            for(int j=2;j<=m;j++)
            {
                if(i==2 && j==2)
                    continue;
                if(dp[i][j]==0)
                    continue;
                if(i==2)
                    dp[i][j]=dp[i][j-1];
                else if(j==2)
                    dp[i][j]=dp[i-1][j];
                else
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        printf("%lld",dp[n][m]);
        return 0;
    }
    
  • 相关阅读:
    网站SEO关键词优化技巧
    SEO操作流程及网站优化技巧
    Linux服务器工作常用命令总结
    【转载】Linux常用命令大全(非常全!!!)
    myBatis出现Mapped Statements collection already contains value for
    maven打成war包之后没有class文件
    查询每个类型最新的一条记录
    关于 MySQL 的 boolean 和 tinyint(1) (转)
    Mac下的eclipse按住ctrl点击无法查看类文件
    Mac 10.10下安装MySQL5.6.21提示安装失败
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11383843.html
Copyright © 2011-2022 走看看