P1002 [NOIP2002 普及组] 过河卒

题目

原题目链接

题目描述
棋盘上 A A A 点有一个过河卒,需要走到目标 B B B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C C C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示, A A A ( 0 , 0 ) (0, 0) (0,0) B B B ( n , m ) (n, m) (n,m),同样马的位置坐标是需要给出的。

现在要求你计算出卒从 A A A 点能够到达 B B B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入格式
一行四个正整数,分别表示 B B B 点坐标和马的坐标。
输出格式
一个整数,表示所有的路径条数。
样例输入 #1
6 6 3 3
样例输出 #1
6
提示
对于 100 % 100 \% 100% 的数据, 1 ≤ n , m ≤ 20 1 \le n, m \le 20 1n,m20 0 ≤ 0 \le 0 马的坐标 ≤ 20 \le 20 20


前言

很奇怪为什么网上的代码都那么麻烦。

首先,这原本就是一个小学的奥数题,(我没学过,但是我差不多二三年级时,无意间旁听懂了),小学二三年级的奥数题逆向思维可以秒解


思路

既然题目说卒只能向下或向右走;那么不妨逆向思维:卒要么可以从上面走过来、要么可以从左边走过来

( 0 , 0 ) (0,0) (0,0)点当然是 1 1 1了。)假如已经算好 x x x种走法到上面那个点 y y y种走法到左边那个点,那么就 x + y x+y x+y种走法到当前这个点

举个例子:先假设没有马,卒从 ( 0 , 0 ) (0,0) (0,0)位置到 ( 10 , 10 ) (10,10) (10,10)位置每个点的走法的数量如下。

1       1       1       1       1       1       1       1       1       1       1
1       2       3       4       5       6       7       8       9       10      11
1       3       6       10      15      21      28      36      45      55      66
1       4       10      20      35      56      84      120     165     220     286
1       5       15      35      70      126     210     330     495     715     1001
1       6       21      56      126     252     462     792     1287    2002    3003
1       7       28      84      210     462     924     1716    3003    5005    8008
1       8       36      120     330     792     1716    3432    6435    11440   19448
1       9       45      165     495     1287    3003    6435    12870   24310   43758
1       10      55      220     715     2002    5005    11440   24310   48620   92378
1       11      66      286     1001    3003    8008    19448   43758   92378   184756

每个点的走法的数量都是到上面和左边两个点的走法的数量的和

那么有马呢,把卒不能去的几个点提前标注出来就够了,如果碰到了标注过的点,就跳过(那么到这个点的走法的数量自然也就为 0 0 0了)。

再举个例子:卒从 ( 0 , 0 ) (0,0) (0,0)位置到 ( 10 , 10 ) (10,10) (10,10)位置,马在 ( 5 , 5 ) (5,5) (5,5)点上。

1       1       1       1       1       1       1       1       1       1       1
1       2       3       4       5       6       7       8       9       10      11
1       3       6       10      15      21      28      36      45      55      66
1       4       10      20      0       21      0       36      81      136     202
1       5       15      0       0       21      21      0       81      217     419
1       6       21      21      21      0       21      21      102     319     738
1       7       28      0       21      21      42      0       102     421     1159
1       8       36      36      0       21      0       0       102     523     1682
1       9       45      81      81      102     102     102     204     727     2409
1       10      55      136     217     319     421     523     727     1454    3863
1       11      66      202     419     738     1159    1682    2409    3863    7726

代码

  1. 框架

    int mian(){return 0;
    }
    

  2. 输入m点的坐标m_xm_y)和马的位置h点的坐标h_xh_y

    #include<cstdio>	//scanf()
    int m_x, m_y, h_x, h_y;
    int main(){scanf("%d %d %d %d", &m_x, &m_y, &h_x, &h_y);return 0;
    }
    

  3. 模拟棋盘(定义一个二维数组),并标出马和马能去的位置(卒不能去的位置

    因为是整形数组,正数用于表示到当前这个点的走法的个数,那么就-1表示这个点卒不能去

    注意到,因为到后面数字会很大,所以记得用long long

    再注意到, ( 0 , 0 ) (0,0) (0,0)点是卒的初始位置,初始值为1

    再再注意到,马能去的位置有可能在棋盘界外;需要判断一下,防止越界。

    #include<cstdio>	//scanf()
    int m_x, m_y, h_x, h_y, p1=1, p2=2;
    long long a[21][21]={1};
    int main(){scanf("%d %d %d %d", &m_x, &m_y, &h_x, &h_y);a[h_x][h_y]=-1;for(int i=0; i<2; i++){p2=-p2;for(int j=0; j<2; j++){if(h_x+p1<0 || h_x+p1>m_x || h_y+p2<0 || h_y+p2>m_y); else a[h_x+p1][h_y+p2]=-1;if(h_x+p2<0 || h_x+p2>m_x || h_y+p1<0 || h_y+p1>m_y);else a[h_x+p2][h_y+p1]=-1;p1=-p1;}}return 0;
    }
    

  4. 有序地遍历棋盘,求出到当前的走法的数量。

    同样,要注意遍历时数组越界。

    #include<cstdio>	//scanf()
    int m_x, m_y, h_x, h_y, p1=1, p2=2, t;
    long long a[21][21]={1};
    int main(){scanf("%d %d %d %d", &m_x, &m_y, &h_x, &h_y);a[h_x][h_y]=-1;for(int i=0; i<2; i++){p2=-p2;for(int j=0; j<2; j++){if(h_x+p1<0 || h_x+p1>m_x || h_y+p2<0 || h_y+p2>m_y); else a[h_x+p1][h_y+p2]=-1;if(h_x+p2<0 || h_x+p2>m_x || h_y+p1<0 || h_y+p1>m_y);else a[h_x+p2][h_y+p1]=-1;p1=-p1;}}for(int x=0; x<=m_x; x++){for(int y=0; y<=m_y; y++){t=0;if(a[x-1][y]==-1 || x-1<0);else t+=a[x-1][y];if(a[x][y-1]==-1 || y-1<0);else t+=a[x][y-1];if(a[x][y]==-1);else a[x][y]+=t;}}return 0;
    }
    

  5. 最后,输出终点m的值即可。

    #include<cstdio>	//scanf(), printf()
    int m_x, m_y, h_x, h_y, p1=1, p2=2, t;
    long long a[21][21]={1};
    int main(){scanf("%d %d %d %d", &m_x, &m_y, &h_x, &h_y);a[h_x][h_y]=-1;for(int i=0; i<2; i++){p2=-p2;for(int j=0; j<2; j++){if(h_x+p1<0 || h_x+p1>m_x || h_y+p2<0 || h_y+p2>m_y); else a[h_x+p1][h_y+p2]=-1;if(h_x+p2<0 || h_x+p2>m_x || h_y+p1<0 || h_y+p1>m_y);else a[h_x+p2][h_y+p1]=-1;p1=-p1;}}for(int x=0; x<=m_x; x++){for(int y=0; y<=m_y; y++){t=0;if(a[x-1][y]==-1 || x-1<0);else t+=a[x-1][y];if(a[x][y-1]==-1 || y-1<0);else t+=a[x][y-1];if(a[x][y]==-1);else a[x][y]+=t;}}printf("%lld", a[m_x][m_y]);return 0;
    }
    


答案

#include<cstdio>
int m_x, m_y, h_x, h_y, p1=1, p2=2, t;
long long a[21][21]={1};
int main(){scanf("%d %d %d %d", &m_x, &m_y, &h_x, &h_y);a[h_x][h_y]=-1;for(int i=0; i<2; i++){p2=-p2;for(int j=0; j<2; j++){if(h_x+p1<0 || h_x+p1>m_x || h_y+p2<0 || h_y+p2>m_y); else a[h_x+p1][h_y+p2]=-1;if(h_x+p2<0 || h_x+p2>m_x || h_y+p1<0 || h_y+p1>m_y);else a[h_x+p2][h_y+p1]=-1;p1=-p1;}}for(int x=0; x<=m_x; x++){for(int y=0; y<=m_y; y++){t=0;if(a[x-1][y]==-1 || x-1<0);else t+=a[x-1][y];if(a[x][y-1]==-1 || y-1<0);else t+=a[x][y-1];if(a[x][y]==-1);else a[x][y]+=t;}}printf("%lld", a[m_x][m_y]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

比较两组二维平面结构的演化

假设1个6*6的二维平面空间&#xff0c;这个空间的行和列只能按照1-2-3-4-5-6-1的顺序变换。这个平面上的物体只能平移。在这个空间里有力&#xff0c;在这些力的作用下&#xff0c;两个点按照 1-7的顺序运动。 - - - - - - - - - - - - - - - A - - - - - …

序列化相关知识总结

目录 一、序列化1.1 基本概念1.1.1 序列化1.1.2 反序列化1.1.3 数据结构、对象与二进制串1.1.4 序列化/反序列化的目的 1.2 几种常见的序列化和反序列化协议1.2.1 XML&SOAP1.2.2 JSON&#xff08;Javascript Object Notation&#xff09;1.2.3 Protobuf 二、安卓下的序列化…

React 开发者完全指南:React.FC()、函数组件 和更多

前言 React.FC 是一个 TypeScript 类型&#xff0c;用于 React 函数组件。FC 代表 Functional Component&#xff08;函数组件&#xff09;。这个类型的使用有助于在 TypeScript 项目中编写类型安全的 React 组件。使用 React.FC 为组件定义类型就可以享受到 TypeScript 提供的…

什么是IP白名单?为什么要设置IP白名单?

在互联网的世界里&#xff0c;IP地址是每个设备与网络进行通信的关键标识。然而&#xff0c;并不是所有的IP地址都可以无限制地访问所有网络资源。为了保障网络安全和资源管理&#xff0c;很多网站和服务会设置IP白名单。本文将详细介绍IP白名单的定义、作用以及为什么要设置IP…

ARMv8/ARMv9架构入门到精通-学习方法

目录 1、学习ARM基础知识2、学习ARM异常(中断)3、学习MMU4、学习Cache5、学习Trustzone和安全架构6、学习ARM架构和各类IP推荐 本文转自 周贺贺&#xff0c;baron&#xff0c;代码改变世界ctw&#xff0c;Arm精选&#xff0c; 资深安全架构专家&#xff0c;11年手机安全/SOC底层…

SpringMVC06、数据处理

6、数据处理 6.1、处理提交数据 1、提交的域名称和处理方法的参数名一致 提交数据 : http://localhost:8080/hello?namekuangshen 处理方法 : RequestMapping("/hello") public String hello(String name){System.out.println(name);return "hello";…

Flask基于配置文件添加项目config配置

文章目录 1. 直接在app文件中添加配置2. 基于配置config文件添加配置2.1 直接在配置文件中定义2.2 调用配置文件中的类2.3 基于字典类实现多种环境配置 Flask 项目中&#xff0c;我们会加载很多配置&#xff0c;比如设置数据库连接信息&#xff0c;设置日志所在路径等等。配置的…

【PTA】L1-011 L1-012 L1-013 L1-014 L1-015(C)第三天

L1-011 A-B 分数 20 作者 陈越 单位 浙江大学 本题要求你计算A−B。不过麻烦的是&#xff0c;A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉&#xff0c;剩下的字符组成的就是字符串A−B。 输入格式&#xff1a; 输入在2行中先后给出字符串A和B。两字符…

javase day02笔记

第二天课堂笔记 源文件的组成部分★★ 源文件外部结构 class 类名{}main方法 public static void main(String [] args){}main方法可有可无 没有main的情况&#xff0c;编译成功&#xff0c;运行失败&#xff0c;没有程序入口 多个main情况&#xff0c;编译报错&#xff0c;…

半监督 伪标签

什么是半监督学习 半监督学习也是一类更接近于人类学习方法的机器学习范式。试想这样一个场景&#xff0c;我们小时候学习识别小猫、小狗、汽车等等物品时&#xff0c;往往只需要父母进行一两次的指导&#xff0c;我们就能很准确地辨认出什么是猫狗。这背后有一个重要原因是&am…

抖音素材网站去哪下载?给你推荐六个抖音自媒体网站

各位抖音视频创作达人们&#xff0c;是否在苦苦寻觅那些能够点燃观众热情&#xff0c;让视频内容跃然屏上的素材宝库呢&#xff1f;此刻&#xff0c;你们的寻觅之旅将迎来终点&#xff01;我将向你们隆重推荐10个精心挑选的视频素材库&#xff0c;它们定能让你们的抖音视频如同…

Windows下安装pip

一、下载pip 官网地址&#xff1a;https://pypi.org/project/pip/#files 1.1、pip工具查找方法 单击官网首页“PyPi”选项 在弹出来的搜索框中输入“pip” 选择最新的pip版本&#xff0c;点进去 下载pip安装包包 二、安装pip 解压“pip-24.0.tar.gz”&#xff0c;进…

【Linux】常用操作命令

目录 基本命令关机和重启帮助命令 用户管理命令添加用户&#xff1a;useradd 命令修改密码&#xff1a;passwd 命令查看登录用户&#xff1a;who 命令查看登录用户详细信息 :w切换用户 目录操作命令cdpwd命令目录查看 ls [-al] 目录操作【增&#xff0c;删&#xff0c;改&#…

java通过poi-tl生成word

我看公司之前做电子合同&#xff0c;使用TIBCO jaspersoft做的报表模板&#xff0c;如果是给自己公司开发或者给客户做项目&#xff0c;这个也没有什么&#xff0c;因为反正模板是固定的&#xff0c;一次性开发&#xff0c;不用担心后续的问题。即使后期有调整&#xff0c;改一…

java新特性stream流的相关操作(二)

参考资料&#xff1a; java新特性stream流的相关操作&#xff08;一&#xff09; groupingBy的综合使用&#xff1a; package com.example.worddemo.test.jacob;import com.alibaba.fastjson2.JSON;import java.util.Arrays; import java.util.List; import java.util.Map; i…

安全运营方案的基本框架和关键要素

一、前言 阐述安全运营方案的目的和重要性。强调安全运营与组织整体战略目标的关联。 二、安全运营原则 确立安全运营的基本原则&#xff0c;如保密性、完整性和可用性。明确安全责任划分&#xff0c;确保各部门和人员履行安全职责。 三、安全风险评估与管理 进行全面的安…

计算两帧雷达数据之间的变换矩阵

文章目录 package.xmlCMakeLists.txtpoint_cloud_registration.cc运行结果 package.xml <?xml version"1.0"?> <package format"2"><name>point_cloud_registration</name><version>0.0.0</version><descriptio…

九州金榜|孩子厌学的因素及解决办法

孩子在学习的过程中&#xff0c;遇到厌学这种情况非常容易见到&#xff0c;这也是孩子在成长的过程中经常遇到的烦恼。面对孩子的厌学&#xff0c;作为家长这时候不要慌乱&#xff0c;要做到分析孩子产生厌学的原因&#xff0c;在去寻找解决孩子厌学的办法。下面九州金榜家庭教…

【漏洞复现】大华ICC智能物联综合管理平台任意文件读取漏洞

Nx01 产品简介 大华智能物联综合管理平台 iConnection Center&#xff08;以下简称&#xff1a;ICC平台&#xff09;&#xff0c;是一套基于智能物联的综合业务管理平台软件&#xff0c;具备强大的后台服务能力&#xff0c;配套了B/S管理员端、C/S客户端、移动APP终端、小程序等…

mmlspark.lightgbm.LightGBMClassifier参数说明

mmlspark.lightgbm.LightGBMClassifier 是一个用于二元分类和多类分类的机器学习模型&#xff0c;它是基于 Microsoft ML for Apache Spark (MMLSpark) 库的。这个类是为了在Spark环境中使用LightGBM实现&#xff0c;提供了大量的参数用于调整模型。下面是一些主要参数的详细中…