题目链接:https://www.luogu.org/problemnew/show/P1002

题意:有一个卒要从A点走到B点,在此过程中,卒不能走到马的控制点,问总共有几条路径。

思路:由于卒到达某点的路径条数取决于他前面点的路径条数,因此我们可以得知这是一道关于动态规划的题,而这个点只能是他的左边点和他的下边点(题上说了卒只能走两个方向),所以可以得出DP的状态方程:dp[ i ][ j ] = dp[ i -1 ][ j ] + dp[ i ][ j -1 ],还要注意的是以防越界,我们让卒的起始点从(1,1)开始,马的坐标和B点的坐标都要加1.

MY  DaiMa:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
typedef long long ll;
ll cunt[25][25];
int dis[12][2] = {{0,0},{-1,2},{-1,-2},{1,2},{1,-2},{-2,-1},{-2,1},{2,-1},{2,1},{0,0}};///马走日
int flag[25][25];///用来标记马的控制点
int main()
{
    int b_x,b_y,horse_x,horse_y;
    scanf("%d%d%d%d",&b_x,&b_y,&horse_x,&horse_y);
    b_x++,b_y++,horse_x++,horse_y++;
    memset(cunt,0,sizeof(cunt));
    memset(flag,0,sizeof(flag));
    //cunt[2][1] = cunt[1][2] = 1;
    cunt[1][1] = 1;
    for(int i = 1; i <= 12; i++)
    {
        if(horse_x+dis[i][0] >= 0 && horse_y+dis[i][1] >= 0)
            flag[horse_x+dis[i][0]][horse_y+dis[i][1]] = 1;///马的控制点走不了
    }
    for(int i = 1; i <= b_x; i++)
    {
        for(int j = 1; j <= b_y; j++)
        {
            if((i==1&&j==1)||flag[i][j] == 1)
                continue;
            cunt[i][j] = cunt[i-1][j]+cunt[i][j-1];///状态转移方程
        }
    }
    printf("%lld\n",cunt[b_x][b_y]);
}