P1002 过河卒 经典 题解 C++

春光十里,不如努力的自己。
下盘象棋,消磨时光。
打住打住!我是来写题的!
分类:DP
++++++++++++++++++++++++++++++++++++++++++++++
题目描述

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

棋盘用坐标表示,A 点 (0,0)(0,0)、B 点 (n,m),同样马的位置坐标是需要给出的。
现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
P1002 过河卒 经典 题解 C++_第1张图片
输入格式
一行四个正整数,分别表示 B 点坐标和马的坐标

输出格式
一个整数,表示所有的路径条数。
+++++++++++++++++++++++++++++++++++++++++++++++++++++
OK就是这样。
我知道你们要AC代码,给

#include 
#include 
#include 
#include 
using namespace std;
int main(){
    //前面是列,后面是行
    long long qp[29][29]={0},b1,b2,m1,m2;
    cin>>b1>>b2>>m1>>m2;
    b1++;
    b2++;
    m1++;
    m2++;
    qp[m1][m2]= -1;
    //=======上==========
    qp[m1+2][m2+1]= -1; //  ——|
    qp[m1+2][m2-1]= -1; //   |
    //=======下==========     |
    qp[m1-2][m2+1]= -1; //   |
    qp[m1-2][m2-1]= -1; //   |
    //=======左==========    |---马的控制点
    qp[m1-1][m2-2]= -1; //   |
    qp[m1+1][m2-2]= -1; //   |
    //=======右==========    |
    qp[m1-1][m2+2]= -1; //   |
    qp[m1+1][m2+2]= -1; //  ——|
    qp[0][1]=1;
    for(int i = 1;i<=b1;i++){
        for(int j = 1;j<=b2;j++){
            if(qp[i][j] != -1){
                if(qp[i-1][j] == -1 and qp[i][j-1]==-1){
                    qp[i][j]=0;
                }
                else if(qp[i-1][j] == -1){
                    qp[i][j]=qp[i][j-1];
                }
                else if(qp[i][j-1] == -1){
                    qp[i][j]=qp[i-1][j];
                }
                else{
                    qp[i][j]=qp[i-1][j]+qp[i][j-1];
                }
            }
            else{
                continue;
            }
        }
    }
    cout<<qp[b1][b2];
    return 0;
}

爱学习的伙伴可以过来。。。
————————————————————讲解————————————————————

long long qp[29][29]={0},b1,b2,m1,m2;
    cin>>b1>>b2>>m1>>m2;
    b1++;
    b2++;
    m1++;
    m2++;
    qp[m1][m2]= -1;
    //=======上==========
    qp[m1+2][m2+1]= -1; //  ——|
    qp[m1+2][m2-1]= -1; //   |
    //=======下==========     |
    qp[m1-2][m2+1]= -1; //   |
    qp[m1-2][m2-1]= -1; //   |
    //=======左==========    |---马的控制点
    qp[m1-1][m2-2]= -1; //   |
    qp[m1+1][m2-2]= -1; //   |
    //=======右==========    |
    qp[m1-1][m2+2]= -1; //   |
    qp[m1+1][m2+2]= -1; //  ——|
    qp[0][1]=1;

非藏简单,就是进行马的控制点和第一个初始化

for(int i = 1;i<=b1;i++){
        for(int j = 1;j<=b2;j++){
            if(qp[i][j] != -1){
                if(qp[i-1][j] == -1 and qp[i][j-1]==-1){
                    qp[i][j]=0;
                }
                else if(qp[i-1][j] == -1){
                    qp[i][j]=qp[i][j-1];
                }
                else if(qp[i][j-1] == -1){
                    qp[i][j]=qp[i-1][j];
                }
                else{
                    qp[i][j]=qp[i-1][j]+qp[i][j-1];
                }
            }
            else{
                continue;
            }
        }
    }

这里是精髓!上面两个嵌套循环便历棋盘,三个if分别是:上面是马的控制点,左边是马的控制点,上面,左面。这里仔细看一下就看得懂,不做介绍,else就是普通没有马的控制点。
就是这样。
写题解不易,喜欢的话点个赞哦

题目出自洛谷https://www.luogu.com.cn/problem/P1002,题解为Sean所写,转载请标明出处

你可能感兴趣的:(P1002 过河卒 经典 题解 C++)