动态策划

题目描述

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

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

img

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

输入格式

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

输出格式

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

输入输出样例

输入 #1复制

6 6 3 3

输出 #1复制

6

说明/提示

对于 100% 的数据,1 ≤ n, m ≤ 20,0 ≤ 马的坐标 ≤20。

再给几组测试数据

输入 #1复制

12 20 5 7

输出 #1复制

24357120

输入 #1复制

20 20 10 10

输出 #1复制

21388094780

思路

题解

#include<iostream>
using namespace std;
long long fun(long long n,long long m,long long x,long long y){
    long long a[21][21];

    int dx[9] = {0,2,2,1,1,-2,-2,-1,-1};
    int dy[9] = {0,1,-1,2,-2,1,-1,2,-2};

    bool g1[21][21];
    fill(g1[0],g1[0]+21*21,true);
    int i,g,h;
    for(i=0;i<=8;i++){
        int xx=x+dx[i],yy=y+dy[i];
        if(xx>=0&&xx<=n&&yy>=0&&yy<=m){
            g1[xx][yy]=false;
        }
    }
    fill(a[0],a[0]+21*21,0);
    a[0][0]=1LL;

    for(g=0; g<=n; g++)
    {
        for(h=0;h<=m;h++)
        {
            if(g1[g][h]){
                if(g==0&&h>=1){
                    a[0][h]=a[0][h-1]; 
                }
                if(h==0&&g>=1){
                    a[g][0]=a[g-1][0]; 
                }
                if(g>=1&&h>=1){   
                    a[g][h] = a[g-1][h]+a[g][h-1];
                } 
            }
        }
    }
    return a[n][m];

}
int main(){

    long long n,m,x,y;
    cin>>n>>m>>x>>y;
    cout<<fun(n,m,x,y)<<endl;

    return 0;
}

枚举


蓝桥杯     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!