[题解]P1002 过河卒

一道很简单的dp题,但本蒟蒻被坑的很惨,发布题解作为警示

坑点:

  1. 本题无法用机器人走方格直接套出,不能对首行首列进行初始化,因为本题有障碍物
  2. dp时必须对原点进行特判防止原点被转移为0
  3. 不开long long见祖宗
#include<bits/stdc++.h>

using namespace std;
using ll=long long;
#define int ll
const int MAX=30;
int bx,by,mx,my;
int dp[MAX][MAX];
bool f[MAX][MAX];
int fx[9][2]={{-1,-2},{1,-2},{-1,2},{1,2},{-2,-1},{2,-1},{-2,1},{2,1},{0,0}};
bool check(int x,int y){
    return x>=0&&x<=bx&&y>=0&&y<=by&&!f[x][y];
}
int solve(){
    for(int j=0;j<=bx;j++)
        for(int i=0;i<=by;i++){
            if(!j&&!i) continue;
            if(check(j,i)) dp[j][i]=dp[j-1][i]+dp[j][i-1];
        }
    return dp[bx][by];
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>bx>>by>>mx>>my;
    for(int i=0;i<9;i++)
        if(check(mx+fx[i][1],my+fx[i][0])) f[mx+fx[i][1]][my+fx[i][0]]=1;
    dp[0][0]=1;
    cout<<solve()<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值