P1002 [NOIP2002 普及组] 过河卒
#include <stdio.h>
#include <iostream>
#include<iomanip>
#include <cstring>
#include <vector>
#pragma warning(disable:4996);
using namespace std;
const int maxn = 110;
//vector<vector<long long> > dp(maxn+1, vector<int>(maxn+1, 0));
long long dp[maxn+1][maxn+1];
bool b[maxn][maxn];
int dx[8] = { 1,1,2,2,-1,-1,-2,-2 };
int dy[8] = { 2,-2,1,-1,2,-2,1,-1 };
int C_x, C_y, B_x, B_y;
bool isHourse(int x, int y)
{
for (int i = 0; i < 8; i++)
{
if (C_x + dx[i] == x && C_y + dy[i] == y)
{
return true;
}
}
return false;
}
int main()
{
// freopen("data.txt", "r", stdin);
// freopen("res.txt", "w", stdout);
cin >> B_x >> B_y >> C_x >> C_y;
//初始化障碍数组
memset(b, false,sizeof(b));
b[C_x][C_y] = true;
for (int i = 0; i < 8; i++)
{
if (C_x + dx[i] >= 0 && C_x + dx[i] <= B_x && C_y + dy[i] <= B_y && C_y + dy[i] >= 0)
{
b[C_x + dx[i]][C_y + dy[i]] = true;
}
}
int k = 0;
while (!b[k][0] && k <= B_x)
{
dp[k++][0] = 1;
}
int l = 0;
while (!b[0][l] && l <= B_y)
{
dp[0][l++] = 1;
}
//dp公式递推
for (int i = 1; i <= B_x; i++)
{
for (int j = 1; j <= B_y; j++)
{
if (b[i][j])
{
dp[i][j] = 0;
}
else
{
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
cout << dp[B_x][B_y];
}