过河卒(特殊的不同路径)
一、【问题描述】
如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(图中的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点(中国象棋规定马走“日”字)。例如图中 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。
棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C不等于A,同时C不等于B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。
【输入形式】
输入一行4个整数,分别表示B点的坐标(n,m)以及对方马的坐标(X,Y)
【输出形式】
输出一个整数,表示路径的条数
【样例输入】
6 6 3 2
【样例输出】
17
代码展示:
#include<bits/stdc++.h>
using namespace std;
long long xb, yb, xh, yh, m[30][30] = { 0 }, f[30][30] = { 0 };
int main()
{
cin >> xb >> yb >> xh >> yh;
xb += 2; yb += 2;
xh += 2; yh += 2;//避免越界访问等情况,添加了一圈虚拟边界
//边界进行赋值
for (int i = 2; i <= 30; i++)
{
f[2][i] = 1;
f[i][2] = 1;
}
//马对应的特殊点进行赋值
m[xh][yh] = 1;
m[xh - 2][yh - 1] = 1;
m[xh - 2][yh + 1] = 1;
m[xh + 2][yh - 1] = 1;
m[xh + 2][yh + 1] = 1;
m[xh + 1][yh + 2] = 1;
m[xh - 1][yh + 2] = 1;
m[xh - 1][yh - 2] = 1;
m[xh + 1][yh - 2] = 1;
f[1][2] = 1;//当i=2时,f[1][2]默认为0,但是它实际是1
for (int i = 2; i <= xb; i++)
{
for (int j = 2; j <= yb; j++) {
if (m[i][j] == 1)
{
f[i][j] = 0;
continue;
}
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
cout << f[xb][yb]<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现