首页 > 其他 > 详细

洛谷P1002 过河卒

时间:2020-03-19 12:47:30      阅读:29      评论:0      收藏:0      [点我收藏+]

原题链接

题目:

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


棋盘用坐标表示,A 点 (0,0)、B 点 (n,m),同样马的位置坐标是需要给出的。


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

思路:

据题意,每一个点都是只能是从它的左方或上方转移的来的。
左方:\(f[i-1][j]\)
上方:\(f[i][j-1]\)
所以转移方程就是\(f[i][j]=max(f[i-1][j],f[i][j-1])\)
但是,棋盘上有一个马,所以我们要将马一步能跳到的点的方案数归0。
最后输出\(f[n][m]\)

code:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
const int N=25;
long long a,b,n,m,f[N][N]; 
long long mapp[N][N];
int dx[]={-1,-2,-2,-1,1,2,2,1};
int dy[]={-2,-1,1,2,2,1,-1,-2};
int main()
{
    cin>>n>>m>>a>>b;
    f[0][0]=1;
    mapp[a][b]=1;
    for(int i=0;i<8;i++)
    {
        mapp[a+dx[i]][b+dy[i]]=1;
    } 
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            if(mapp[i][j]==1)
            {
                f[i][j]=0;
            }
            else
            {
                if(i>=1&&j>=1) 
                f[i][j]+=f[i-1][j]+f[i][j-1];
                else if(i>=1)
                {
                    f[i][j]+=f[i-1][j];
                } 
                else if(j>=1)
                {
                    f[i][j]+=f[i][j-1];
                }
            }
        }
    }
    cout<<f[n][m];
    return 0;
}

洛谷P1002 过河卒

原文:https://www.cnblogs.com/pjxpjx/p/12523403.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!