P1002 过河卒
题目描述
棋盘上 AA 点有一个过河卒,需要走到目标 BB 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 CC 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,AA 点 (0, 0)(0,0)、BB 点 (n, m)(n,m),同样马的位置坐标是需要给出的。
现在要求你计算出卒从 AA 点能够到达 BB 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入格式
一行四个正整数,分别表示 BB 点坐标和马的坐标。
输出格式
一个整数,表示所有的路径条数。
输入输出样例
输入 #1
6 6 3 3
输出 #1
6
说明/提示
对于 100% 的数据,1 <= n, m <= 20,0≤ 马的坐标 ≤ 20。
我的思路
核心想法:每个点的路径条数是该点左边路径条数加上上边路径条数
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
要注意的是:数组的边界,给马的控制点做标记时,要考虑边界
if (bx >= 0 && bx <= 20 && by >= 0 && by <= 20)bj[bx][by] = -1;
当计算i – 0 时,只需加上他上边的路径条数,相同,j == 0,只需加上左边的路径条数。
continue;if (i == 0)dp[i][j] = dp[i][j - 1];else if (j == 0)dp[i][j] = dp[i - 1][j];
我的代码
#include<bits/stdc++.h>
using namespace std;
int n, m, x, y, bx, by;
long long bj[30][30], dp[30][30], z[8][2] = {
{
1, -2}, {
-1, -2}, {
-2, -1}, {
-2, 1}, {
-1, 2}, {
1, 2}, {
2, 1}, {
2, -1}};
int main() {
cin >> n >> m >> x >> y;for (int i = 0; i < 8; i++) {
bx = x + z[i][0];by = y + z[i][1];if (bx >= 0 && bx <= 20 && by >= 0 && by <= 20)bj[bx][by] = -1;} bj[x][y] = -1;dp[0][0] = 1;for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
if (bj[i][j] == -1 || (i == 0 && j == 0))continue;if (i == 0)dp[i][j] = dp[i][j - 1];else if (j == 0)dp[i][j] = dp[i - 1][j];elsedp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } }cout << dp[n][m];return 0;
}