P1002 [NOIP2002 普及组] 过河卒 入门级别的dp

发布时间 2023-07-12 17:12:08作者: ataraxyyeah

 思路:

1.标记马点 z[i][[j]=0

2.正常 z[i][j]=z[i-1][j]+z[i][j-1]

#include<iostream>
using namespace std;

int n,m,a,b;
long long ma[30][30],bck[30][30];

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

void can_not_reach(int x,int y)
{
    ma[x][y]=1;
    for(int i=0;i<8;i++)
    {
        if(x+dx[i]>=0&&x+dx[i]<=n&&y+dy[i]>=0&&y+dy[i]<=m)
        {
            ma[x+dx[i]][y+dy[i]]=1;
        }
    }
}

int main()
{
    cin>>n>>m>>a>>b;
    can_not_reach(a,b);
    bck[1][0]=1;
    for(int i=1;i<=n+1;i++)
    {
        for(int j=1;j<=m+1;j++)
        {
            bck[i][j]=bck[i-1][j]+bck[i][j-1];

            if(ma[i-1][j-1])bck[i][j]=0;
        }
    }

    cout<<bck[n+1][m+1];
}