【题目】棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,A 点(0,0)、B 点(n,m),同样马的位置坐标是需要给出的。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
【输入】
6 6 3 3
【输出】
6
【代码】
#include <cstdio>
using namespace std;
int main()
{
int x, y, n, m;
int x1, y1;
int f[9][2] = {{0, 0}, {-2, -1}, {-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}};
bool vis[21][21] = {0};
unsigned long long ans[21][21] = {0};
scanf("%d%d%d%d", &n, &m, &x, &y);
for (int i = 0; i < 9; i++)
{
x1 = x + f[i][0];
y1 = y + f[i][1];
if ((x1 > -1) && (x1 <= n) && (y1 > -1) && (y1 <= m))
{
vis[x1][y1] = 1;
}
}
if (!vis[0][0])
ans[0][0] = 1;
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= m; j++)
{
if (vis[i][j])
continue;
else
{
if (i == 0)
if (j)
ans[i][j] = ans[i][j - 1];
else
continue;
else
{
if (j == 0)
ans[i][j] = ans[i - 1][j];
else
ans[i][j] = ans[i - 1][j] + ans[i][j - 1];
}
}
}
}
printf("%llu", ans[n][m]);
}
【TIPS】
提交到最后快炸了,真的是太久没有写代码开始手生了
1. 考虑初始值(0,0)的合法性
2. 哪怕只是20*20,也得考虑会不会爆int,ull!!