【9307】&【a303】过河卒(NOIP2002)
Time Limit: 10 second
Memory Limit: 2 MB
问题描述
如图,A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。
同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为方马的控制点。例如上图C点上的马可以控制9个点(图中的P1,P2...P8和C)。卒不能通过对方的控制点。
棋盘用坐标表示,A点(0,0)、B点(n, m)(n,m为不超过20的整数,并由键盘输入),同样马 的位置坐标是需要给出的(约定:C≠A,同时C≠B)。现在要求你计算出卒从A点能够到达B点的路 径的条数。

Input
B点的坐标(n,m)以及对方马的坐标(X,Y) {不用判错}
Output
一个整数(路径的条数)。
Sample Input
8 6 0 4
Sample Output
1617
【题解】
这是个递推题,每个卒只能从左上和右上角到达。
设a[i][j]表示卒到达(i,j)这个点的方案数,a[i][j] = a[i][j-1] + a[i-1][j];
首先用一个二维的bool型数组bo[21][21]来表示各个点是否为马所占据。一开始所有的点都置为true.然后把马所在的位置和马跳一步能到的位置置为false。表示这些点不能放卒。接下来是边界,首先for i = 1;i <= xB;i++ 如果遇到的bo[i][0]==true则这个点a[i][0] = 1,如果为false则直接停止。不再往下置1;上边界也是一样的规律。
然后从(1,1)一直递推到XB,YB就可以了,用普通的int不能完整存下数据,要用double型来存。
【代码】
#include <cstdio> int xb,yb,xm,ym;
double a[21][21];
bool bo[21][21]; void input_data()
{
scanf("%d %d %d %d",&xb,&yb,&xm,&ym);
for (int i = 0;i <= xb;i++)
for (int j = 0;j <= yb;j++) //一开始 所有的位置都能放
bo[i][j] = true;
for (int i = 0;i <= xb;i++) //到达所有点的方案数,都置为0.
for (int j = 0;j <= yb;j++)
a[i][j] = 0;
int x0,y0; //x0 y0是马能控制的点 bo[xm][ym] = false; //这是马所在的点 x0 = xm -1;y0 = ym-2; //接下来的多行都是用来标记马跳一步能到达的点。
if ( (x0 >= 0) && (y0 >=0))
bo[x0][y0] = false; x0 = xm -2;y0 = ym -1;
if ( (x0 >= 0) && (y0 >=0))
bo[x0][y0] = false; x0 = xm -2;y0 = ym+1;
if ( (x0 >= 0) && (y0 <=yb))
bo[x0][y0] = false; x0 = xm - 1;y0 = ym +2;
if ( (x0 >= 0) && (y0 <=yb))
bo[x0][y0] = false; x0 = xm +1;y0 = ym +2;
if ( ( x0 <= xb) && (y0 <= yb))
bo[x0][y0] = false; x0 = xm +2;y0 = ym+1;
if ( (x0 <= xb) && (y0 <= yb))
bo[x0][y0] = false; x0 = xm+1;y0 = ym-2;
if ( (x0 <= xb) && (y0 >=0))
bo[x0][y0] = false; x0 = xm +2;y0 = ym-1;
if ( (x0 <= xb) && (y0 >=0))
bo[x0][y0] = false;
} void get_ans()
{
for (int i = 0;i <= xb;i++) //接下来两个for循环 处理边界问题。
if (bo[i][0])
a[i][0] = 1;
else
break;
for (int i = 0;i <= yb;i++)
if (bo[0][i])
a[0][i] = 1;
else
break;
for (int i = 1;i <= xb;i++) //进行递推
for (int j = 1;j <= yb;j++)
if (bo[i][j])
a[i][j] = a[i-1][j] + a[i][j-1];
} void output_ans()
{
printf("%0.lf\n",a[xb][yb]); //%0.lf用来输出double,且不保留小数。
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
get_ans();
output_ans();
return 0;
}
【9307】&【a303】过河卒(NOIP2002)的更多相关文章
- 过河卒(Noip2002)(dp)
过河卒(Noip2002) 时间限制: 1 Sec 内存限制: 128 MB提交: 7 解决: 6[提交][状态][讨论版][命题人:quanxing] 题目描述 棋盘上A点有一个过河卒,需要走到 ...
- 过河卒(NOIP2002)
题目链接:过河卒 直接模拟?会T掉60分. 所以我们可以采用递推,怎么想到的? 因为卒子只能向下或向右走,所以走到一个点的方法数,等于走到它上面点的方法数加上走到它左边点的方法数,这样就可以地推了. ...
- 【openjudge】【递推】例3.6 过河卒(Noip2002)
[题目描述] 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1 ...
- LFYZ-OJ ID: 1020 过河卒(NOIP2002)
过河卒 Proble Description 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃 ...
- noip2002 普及组 过河卒
题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过 ...
- NOIP2002 过河卒(DFS,DP)
https://www.luogu.org/problem/P1002 题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如 ...
- AC日记——过河卒 洛谷 1002
题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...
- NOIP 2002过河卒 Label:dp
题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例如 ...
- ACM题目————马拦过河卒
题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...
随机推荐
- 斯坦福CS课程列表
http://exploredegrees.stanford.edu/coursedescriptions/cs/ CS 101. Introduction to Computing Principl ...
- 【JZOJ4816】【NOIP2016提高A组五校联考4】label
题目描述 输入 输出 样例输入 3 2 2 0 1 2 3 3 2 1 3 1 2 3 3 1 1 2 2 3 样例输出 4 2 12 数据范围 样例解释 解法 设f[i][j]为在第i个点填了j的合 ...
- java通过实体类组装报文
条件: 1.实体类字段名 首字母小写(java规范),再通过报文的需求,填充的时候做对应修改即可(正常报文首字母是大写的)! 2.假如xml标签首字母是小写,那么实体类就给大写,首字母是大写,那么实体 ...
- 只想着一直调用一直爽, 那API凭证泄漏风险如何破?
如今各家云厂商都通过给用户提供API调用的方式来实现一些自动化编排方面的需求.为了解决调用API过程中的通信加密和身份认证问题,大多数云厂商会使用同一套技术方案—基于非对称密钥算法的鉴权密钥对,这里的 ...
- pytorch 多GPU训练总结(DataParallel的使用)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/weixin_40087578/artic ...
- BZOJ1085 luogu2324骑士精神题解
没有什么特别好的办法,只好用搜索去做 因为一次移动最多归位一个骑士 所以可以想到用IDA*,为了简化状态 我们用k,x,y,sum来表示移动了k步,空格在x,y,还用sum个没有归位的情况 然后枚举转 ...
- phpexcel使用说明1
<?php /** * PHPEXCEL生成excel文件 * @author:firmy * @desc 支持任意行列数据生成excel文件,暂未添加单元格样式和对齐 */ require_o ...
- 【Linux】根目录命名的意义
1./bin :获得最小的系统可操作性所需要的命令2./boot :内核和加载内核所需的文件3./dev :终端.磁盘.调制解调器等的设备项4./etc :关键的启动文件和配置文件5./home :用 ...
- UVa 10220 【大整数】
uva 10220 可采用uva 623这道题求N!,再最后稍微改一下就好. 参考代码: } #include<cstdio> #include<cstring> #inclu ...
- 巧用 PHP 数组函数
0x00 前言 PHP 的数组是一种很强大的数据类型,与此同时 PHP 内置了一系列与数组相关的函数可以很轻易的实现日常开发的功能.但是我发现好像很多小伙伴都忽略了内置函数的作用(比如我自己就编写过一 ...