题目描述
棋盘上A点有一个过河卒,需要走到目标 $B$ 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,$A$ 点 $(0, 0)$、$B$ 点 $(n, m)$,同样马的位置坐标是需要给出的。
现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入格式
一行四个正整数,分别表示 B 点坐标和马的坐标。
输出格式
一个整数,表示所有的路径条数。
样例 #1
样例输入 #1
6 6 3 3
样例输出 #1
6
提示
对于 100 %的数据,1 <= n, m <= 20,0 <= 马的坐标 <= 20$。
【题目来源】
NOIP 2002 普及组第四题
首先,分析题目的要求,由于马的控制点有可能会超出地图的边界,为了便于输入马的控制点我们不妨将所有的点都向右向下挪动2,以此便于操作,此时的出发点将会是从(2,2)出发
我们用
由此我们可知只需遍历i,j即可,最后输出dp[i][j];
#include<iostream>
using namespace std;
int m[30][30];//棋盘
int dp[30][30];
int x[9] = { 0,1,2,2,1,-1,-2,-2,-1 };
int y[9] = { 0,2,1,-1,-2,-2,-1,1,2 };
int main()
{
int bx, by, cx, cy;
int ax = 2, ay = 2;
cin >> bx >> by >> cx >> cy;
bx += 2;
by += 2;
cx += 2;
cy += 2;
for (int i = 0; i < 9; i++)
{
m[cx + x[i]][cy + y[i]] = 1;
}
dp[2][1] = 1;//为使dp[2][2]=1的初始化
for (int i = 2; i <= bx; i++)
{
for (int j = 2; j <= by; j++)
{
if (m[i][j] == 1)
{
dp[i][j] = 0;
}
else
{
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
cout << dp[bx][by];
return 0;
}