P1002 过河卒(dp)

题目链接:https://www.luogu.com.cn/problem/P1002

题意:

棋盘上,卒从(0,0)只能向右或下走,不能走马所在和马控制的点,问到某一点的方案数。

思路:

标记不可访问的九个点后逐行递推:$dp[i][j]=dp[i-1][j]+dp[i][j-1]$。

#include <bits/stdc++.h>
using namespace std;
const int M=30;
long long dp[M][M];
int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};
int main()
{
    int a,b,c,d;cin>>a>>b>>c>>d;

    dp[c][d]=-1;
    for(int i=0;i<8;i++){
        int x=c+dir[i][0],y=d+dir[i][1];
        if(x>=0&&x<=20&&y>=0&&y<=20)
            dp[x][y]=-1;
    }

    dp[0][0]=1;
    for(int i=0;i<=20;i++)
        for(int j=0;j<=20;j++)
            if(dp[i][j]!=-1){
                if(i-1>=0&&dp[i-1][j]!=-1) dp[i][j]+=dp[i-1][j];
                if(j-1>=0&&dp[i][j-1]!=-1) dp[i][j]+=dp[i][j-1];
            }

    cout<<dp[a][b];

    return 0;
}

 

posted @ 2020-04-03 19:15  Kanoon  阅读(154)  评论(0)    收藏  举报