A 点有一个过河卒,需要走到目标 B
点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如下图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如下图
C 点可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。 棋盘用坐标表示,现给定A 点位置为(0,0)B
点位置为(n,m)(n,m 为不超过 20 的整数),马的位置为C(X,Y)(约定:
C点与A点不重叠,与B点也不重叠)。要求你计算出卒从 A 点能够到达 B 点的路径的条数。
输入描述
B点的坐标(n,m)以及对方马的坐标(X,Y)(马的坐标一定在棋盘范围内,但要注意,可能落在边界的轴上)
用例输入 1
6 6 3 2
用例输出 1
17
#include<iostream>
using namespace std;
int P[1000][1000] = { 0 };
int n = 0;
int X1, Y1, X2, Y2;
void DFS(int x, int y) {
if (P[x + 1][y] == 1) {
DFS(x + 1, y);
}
if (P[x][y + 1] == 1) {
DFS(x, y + 1);
}
if (x == X1 && y == Y1) {
n++;
}
return;
}
int main() {
cin >> X1 >> Y1 >> X2 >> Y2;
for (int i = 0; i <= X1; i++) {
for (int j = 0; j <= Y1; j++) {
P[i][j] = 1;
}
}//将可以走的位置定为1
if (X2 >= 1) {
P[X2 - 1][Y2 + 2] = 0;
if (Y2 >= 2) {
P[X2 - 1][Y2 - 2] = 0;
}
if (X2 >= 2) {
P[X2 - 2][Y2 + 1] = 0;
if (Y2 > 1) {
P[X2 - 2][Y2 - 1] = 0;
}
}
}
if (Y2 >= 1) {
P[X2 + 2][Y2 - 1] = 0;
if (Y2 >= 2) {
P[X2 + 1][Y2 - 2] = 0;
}
}
P[X2 + 1][Y2 + 2] = 0;
P[X2 + 2][Y2 + 1] = 0;
P[X2][Y2] = 0;
//马的控制点
DFS(0, 0);//深度优先搜索(卒)
cout << n;
}