本题因为只能从左上走到右下,所以比较能容易想到dp,同时注意初始化的一个点,就是碰到不可走的点的时候,就面就全部不能走了
//@author:hairu,wu
//@from:ahut
#include<iostream>
using namespace std;
typedef long long ll;
int go[][2]={
-2,-1,
-2,1,
-1,-2,
-1,2,
1,-2,
1,2,
2,-1,
2,1
};
int main(){
int m,n,x,y;
cin >> m>> n>> x>> y;
ll dp[30][30];
int maze[30][30];
//初始化
fill(maze[0],maze[0]+30*30,1);
fill(dp[0],dp[0]+30*30,0);
//记录控制点
maze[x][y]=0;
for(int i=0;i<8;i++){
int dx=x+go[i][0];
int dy=y+go[i][1];
if(dx>=0 && dx<=m && dy>=0 && dy<=n){
maze[dx][dy]=0;
}
}
//状态初始值
for(int j=0;j<=n;j++){
if(maze[0][j]==1)
dp[0][j]=1;
else break; //注意:本条路径是初始化第0行,只能从左到右
//如果有一个是控制点,那么后面就全部不能走了,所以后面的都是0
}
for(int i=0;i<=m;i++){
if(maze[i][0]==1)
dp[i][0]=1;
else break; //这个和上面的类似,知识路径只能从上到下
}
//状态转移
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(maze[i][j]==1){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
cout<<dp[m][n]<<endl;
return 0;
}