P1002 [NOIP2002 普及组] 过河卒题解

题目

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

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

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

输入输出格式

输入格式

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

输出格式

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

解析

这个题目是一个典型的动态规划的题目,同样采用递推的思想,找出点的状态转移方程,只是需要更多的考虑一个马阻止走的格子。

复制代码
#include<iostream>
using namespace std;
const int dir[8][2]={{1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};
bool d[30][30];
long long dp[30][30],n,m,cx,cy;
int main(){
	cin>>n>>m>>cx>>cy;
	d[cx][cy]=true;
	for(int i=0;i<8;i++){//标记不能走的地方 
		int tx=cx+dir[i][0],ty=cy+dir[i][1];
		if(tx>=0&&tx<=n&&ty>=0&&ty<=m){
			d[tx][ty]=true;
		}
	} 
	dp[0][0]=1;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=m;j++){
			if(d[i][j]==false){//根据状态转移方程求解 
				if(i){
					dp[i][j]+=dp[i-1][j];
				}
				if(j){
					dp[i][j]+=dp[i][j-1];
				}
			}
		}
	}
	cout<<dp[n][m]<<endl;
	return 0;
}
相关推荐
闻缺陷则喜何志丹4 分钟前
【构造 前缀和】P8902 [USACO22DEC] Range Reconstruction S|普及+
c++·算法·前缀和·洛谷·构造
摸鱼仙人~6 分钟前
动态规划求解 20 个通用模板
算法·动态规划
记忆多11 分钟前
c++内联函数
算法
仟濹24 分钟前
【算法打卡day20(2026-03-12 周四)算法/技巧:哈希表,双指针,字符串交换处理】5个题
数据结构·算法·散列表
老四啊laosi24 分钟前
[C++进阶] 16. 继承
c++·继承
陌夏25 分钟前
双指针与滑动窗口
算法
MicroTech202534 分钟前
MLGO微算法科技,推出革命性量子算法ANQITE,推动量子计算新时代
科技·算法·量子计算
实心儿儿36 分钟前
C++ —— 继承
开发语言·c++
AMoon丶43 分钟前
C++基础-类、对象
java·linux·服务器·c语言·开发语言·jvm·c++
17(无规则自律)1 小时前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode·哈希算法