【洛谷】P1002 [NOIP2002 普及组] 过河卒

题目链接:https://s.heyiqi.cc/nhs

题目描述

棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

棋盘用坐标表示,A 点 (0,0)、B 点 (n,m),同样马的位置坐标是需要给出的。

现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入格式

一行四个正整数,分别表示 B 点坐标和马的坐标。

输出格式

一个整数,表示所有的路径条数。

输入输出样例

输入 #1

1
6 6 3 3

输出 #1

1
6

说明/提示

对于 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
//
// Created by 何艺麒 on 2021/9/19.
//

#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;
}

【洛谷】P1002 [NOIP2002 普及组] 过河卒
https://heyq.cc/2021/09/19/luogu-P1002/
作者
YiQi He
发布于
2021年9月19日
许可协议