P1002 [NOIP2002 普及组] 过河卒
棋盘上
�
A 点有一个过河卒,需要走到目标
�
B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上
�
C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,
�
A 点
(
0
,
0
)
(0,0)、
�
B 点
(
�
,
�
)
(n,m),同样马的位置坐标是需要给出的。
现在要求你计算出卒从
�
A 点能够到达
�
B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入格式
一行四个正整数,分别表示
�
B 点坐标和马的坐标。
输出格式
一个整数,表示所有的路径条数。
include
include
include
using namespace std;
const int N = 100;
bool a[N][N];
bool g[N][N];
int b[N][N];
long long f[N][N];
int main()
{
int n, m, x2, y2;
cin >> n >> m >> x2 >> y2;//n,m:b点坐标,马的位置。
int dx[] = {-1,-2,-2,-1,1,2,2,1};//偏移量
int dy[] = {-2,-1,1,2,-2,-1,1,2};
g[x2][y2] = true;//将马的位置设为1
for (int i = 0; i < 8; i++)
{
int t = x2 + dx[i], p = y2 + dy[i];//计算马可能的位置
if (t >= 0 && t <= n && p >= 0 && p <= m) g[t][p] = true;//将可能位置设为1.
}
f[0][0] = 1;
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= m; j++)
{
if (g[i][j] == false)//当马到不了
{
if (i) f[i][j] += f[i-1][j];//到{i,j}点的所有路径数=从{i-1,j}点的路径数之和以及到{i,j-1}点的路径数之和
if (j) f[i][j] += f[i][j-1];
}
}
}
cout << f[n][m];输出所有路径数。
return 0;
}