首页 > 其他分享 >信息学奥赛一本通1314:【例3.6】过河卒(Noip2002)

信息学奥赛一本通1314:【例3.6】过河卒(Noip2002)

时间:2024-08-28 18:56:01浏览次数:14  
标签:1314 Noip2002 int mx 3.6 控制点 坐标 my 步数

【题目描述】

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1中的C点和P1,……,P8,卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。现在要求你计算出卒从A点能够到达B点的路径的条数。

【输入】

给出n、m和C点的坐标。

【输出】

从A点能够到达B点的路径的条数。

【输入样例】

8 6 0 4

【输出样例】

1617

【解题思路】

定义一个二维数组f[25][25],使用双层for循环遍历该数组,数组里的各个元素的值表示卒走到当前点的步数。

首先映射出马的所有控制点,例如p1点,马跳到p1点需在x坐标上向前移动两格,在y坐标上向前移动一格,所以mx[1] = 2,my[1] = 1,p1点坐标为(x+mx[1],y+my[1]);再如p5点,马跳到p5点需在x坐标上后退两格,在y坐标上后退一格,所以mx[5] = -2,my[5] = -1,p5点的坐标为(x+mx[5],y+my[5])。

将所有马的控制点算出来后,用judg函数判断马的所有控制点是否越界。若不越界,用二维数组g[25][25]保存马的控制点,遍历棋盘上每一个点,当这个点为马的控制点时,规定到这个点的所需步数为0,即f[i][j] = 0。由于卒只能向下或向右走,因此卒走到当前遍历的点只能从上方的格子或左侧的格子来,走到当前点所需步数即为走到上一格的步数加上走到左侧那一格的步数,故递推式为:a[i][j] = a[i-1][j] + a[i][j-1]。

【题解代码】

#include <bits/stdc++.h>
using namespace std;
int mx[10]={0,2,1,-1,-2,-2,-1,1,2},my[10]={0,1,2,2,1,-1,-2,-2,-1};
bool judge(int atemp,int btemp,int n,int m){
	if (atemp>=0 && atemp<=n && btemp>=0 && btemp<=m) return true;
	return false;
} 
long long g[25][25]={0},f[25][25]={0};//涉及到累加数据范围可能会越界,所以用long long类型 
int main(){
	int x,y,n,m,atemp,btemp;
	cin >> n >> m >> x >> y;
	g[x][y] = 1;    //马所在的点也为马的控制点,需标记出来
	for (int i=1;i<=8;i++){
		atemp = x+mx[i];
		btemp = y+my[i];
		if (judge(atemp,btemp,n,m)) g[atemp][btemp] = 1;    //将马的控制点标记出来
	}
	f[0][0] = 1-g[0][0];    //若起点为马的控制点,则所需步数为0,不是马的控制点则为1
	for (int i=0;i<=n;i++){
		for (int j=0;j<=m;j++){
			if (g[i][j] == 1) continue;    //遇到马的控制点便跳过
			if (i != 0) f[i][j] += f[i-1][j];
			if (j != 0) f[i][j] += f[i][j-1];
		}
	}cout << f[n][m];
	return 0;
}

标签:1314,Noip2002,int,mx,3.6,控制点,坐标,my,步数
From: https://blog.csdn.net/m0_66498724/article/details/132511077

相关文章

  • AP3466 外围简单 输入4-30V 3.6A 降压恒压驱动芯片 充电器方案
    产品描述AP3466是一款支持宽电压输入的同步降压电源管理芯片,输入电压4-30V范围内可实现3.6A的连续电流输出。通过调节FB端口的分压电阻,设定输出1.8V到28V的稳定电压。AP3466具有优秀的恒压/恒流(CC/CV)特性。AP3466采用电流模式的环路控制原理,实现了快速的动态响应。A......
  • 【C++ Primer Plus习题】3.6
    问题:解答:#include<iostream>usingnamespacestd;intmain(){ floatmiles=0; floatgallons=0; floatgallon=0; cout<<"请输入驱车里程(单位为英里):"; cin>>miles; cout<<"请输入使用的汽油量(单位为加仑):"; cin>>g......
  • 3.6 zset(有序集合)
    zset(有序集合)有序集合(score/value),去重并且根据score权重值来进行排序的。score从小到大排列。(1)添加成员zaddkeyscore1member1score2member2score3member3....设置榜单achievements,设置成绩和用户名作为achievements的成员127.0.0.1:6379>zaddachievements61xiao......
  • P1002 [NOIP2002 普及组] 过河卒
    题目描述棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,A 点 (0,0)、B 点 (n,m),同样马的位置坐......
  • springboot电竞专题网站的设计与实现-附源码641314
    摘 要近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用。简单的流程、便捷可靠的支付方式、快捷畅通的物流快递、安全的信息保护都使得电子商务越来越赢得网民们的青睐。现今,大量的计算机技术应用于商业领域,......
  • SeaTunnel 2.3.6 在Ubuntu环境的安装
    SeaTunnel2.3.6在Ubuntu环境的安装目录SeaTunnel2.3.6在Ubuntu环境的安装环境变量下载软件下载连接器连接器下载配置下载连接器插件下载连接器加速测试SeaTunnel示例批任务测试Mysql-CDC到Postgresql创建测试表编辑任务配置文件下载数据库驱动启动集群模式启动任务环境说......
  • 《逆行人生》电影迅雷下载3.69GB/MP4(百度云磁力资源共享)HD高清版
    在光怪陆离的电影世界里,总有一些作品能够触动人心,让人在欢笑与泪水中重新审视生活的意义。《逆行人生》就是这样一部电影,它不仅仅是一部简单的现实题材作品,更是一次对人性光辉和社会现实的深刻探讨。由徐峥执导并主演,这部电影汇聚了冯兵、贾冰、王骁、丁勇岱等众多实力派演员,......
  • macOS Ventura 13.6.9 (22G830) Boot ISO 原版可引导镜像下载
    macOSVentura13.6.9(22G830)BootISO原版可引导镜像下载2024年8月8日凌晨,macOSSonoma14.6.1发布,本更新包含了重要的错误修复,并解决了导致高级数据保护无法启用或停用的问题。同时带来了macOSVentura13.6.9安全更新。macOSVentura13.6及更新版本,如无特殊说明......
  • macOS Ventura 13.6.9 (22G830) 正式版发布,ISO、IPSW、PKG 下载
    macOSVentura13.6.9(22G830)正式版发布,ISO、IPSW、PKG下载2024年8月8日凌晨,macOSSonoma14.6.1发布,本更新包含了重要的错误修复,并解决了导致高级数据保护无法启用或停用的问题。同时带来了macOSVentura13.6.9安全更新。macOSVentura13.6及更新版本,如无特殊说......
  • 2.3.6版本发布!Apache SeaTunnel Zeta引擎迎来新架构!
    ApacheSeaTunnel2.3.6版本于近日正式发布,社区期待的SeaTunnelZetaMaster/Worker新架构、事件通知机制、支持动态编译的transform等新功能和新能力在这次版本中都有了全面的更新,并添加了首个向量数据库Milvus。此外,本版本还进行了一些基础性的Bug修复和文档修复等,欢迎尝......