一道很简单的dp题,但本蒟蒻被坑的很惨,发布题解作为警示
坑点:
- 本题无法用机器人走方格直接套出,不能对首行首列进行初始化,因为本题有障碍物
- dp时必须对原点进行特判防止原点被转移为0
- 不开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;
}