题目链接:https://s.heyiqi.cc/nhs
题目描述
棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A 点 (0,0)、B 点 (n,m),同样马的位置坐标是需要给出的。

现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入格式
一行四个正整数,分别表示 B 点坐标和马的坐标。
输出格式
一个整数,表示所有的路径条数。
输入输出样例
输入 #1
输出 #1
说明/提示
对于 100% 的数据,1 <= n,m <= 20 ,0 <= 马的坐标 <= 20。
分析
首先将🐎所有可能的落点(包括原点)一共9个点标记为-1,然后动态规划求得可以走的路径总数。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
int main() { int i, j, x, y; cin >> i >> j >> x >> y; ++i; ++j; vector<vector<ll>> dp(i, vector<ll>(j, 0)); dp[x][y] = -1; if (x - 2 > -1 && y - 1 > -1)dp[x - 2][y - 1] = -1; if (x - 1 > -1 && y - 2 > -1)dp[x - 1][y - 2] = -1; if (x - 2 > -1 && y + 1 < j)dp[x - 2][y + 1] = -1; if (x - 1 > -1 && y + 2 < j)dp[x - 1][y + 2] = -1; if (x + 1 < i && y - 2 > -1)dp[x + 1][y - 2] = -1; if (x + 2 < i && y - 1 > -1)dp[x + 2][y - 1] = -1; if (x + 1 < i && y + 2 < j)dp[x + 1][y + 2] = -1; if (x + 2 < i && y + 1 < j)dp[x + 2][y + 1] = -1; for (int k = 0; k < i; k++) { for (int l = 0; l < j; l++) { if (dp[k][l] == -1)continue; ll top = 0; ll left = 0; if (k - 1 > -1 && dp[k - 1][l] != -1)top = dp[k - 1][l]; if (l - 1 > -1 && dp[k][l - 1] != -1)left = dp[k][l - 1]; dp[k][l] = top + left; if (k == 0 && l == 0 && dp[0][0] != -1)dp[k][l] = 1; } } cout << dp[i - 1][j - 1] << endl; return 0; }
|