过河卒(特殊的不同路径)

一、【问题描述】
如图,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;
}
posted @   爱学习的小许?  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示