- 首先是long long的问题, 一开始没意识到这个..
- 然后是,我在代码里一开始把第一行和第一列都初始化成1, 之后把马走的点都设成很小的数字,然而没意识到如果马在第一行或第一列某个位置,那么之后的位置也是到不了的。。。否则3 4 样例过不了(不过我没开long long时怎么也是3 4 过不了其它都过了)
#include<iostream>
#include<vector>
using namespace std;
#define INT_MIN -1e18
int dir[9][2] = {{-2, -1}, {-1, -2}, {1, -2}, {2, -1}, {-2, 1},\
{-1, 2}, {1, 2}, {2, 1}, {0, 0}};
int main(){
using ll = long long;
int a, b, c, d;
cin >> a >> b >> c >> d;
vector<vector<ll>> dp(35, vector<ll>(35, 0));
for(int i = 1; i < 35; i ++) dp[0][i] = 1, dp[i][0] = 1;
for(int i = 0; i < 9; i ++){
int xx = c + dir[i][0], yy = d + dir[i][1];
if(xx >= 0 && xx <= a && yy >= 0 && yy <= b){
dp[xx][yy] = INT_MIN;
}
if(xx == 0 && yy > 0) while(++ yy < 35) dp[0][yy] = 0;
if(yy == 0 && xx > 0) while(++ xx < 35) dp[xx][0] = 0;
}
for(int i = 1; i <= a; i ++){
for(int j = 1; j <= b; j ++){
if(dp[i-1][j] > 0) dp[i][j] += dp[i-1][j];
if(dp[i][j-1] > 0) dp[i][j] += dp[i][j-1];
}
}
cout << dp[a][b];
}