【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点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...
随机推荐
- Duplicate a whole line in Vim
yy or Y to copy the line or dd to delete (cutting) the line then p to paste the copied or deleted te ...
- LintCode刷题笔记-- O(1) Check Power of 2
标签: 位运算 题目: Using O(1) time to check whether an integer n is a power of 2. 解题思路: 这道题是利用位运算判断一个数是不是2 ...
- Spring_Aop基于配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- SQLServer —— EXISTS子查询
一.删除数据库 use master go if exists (select * from sysdatabases where name = 'Demo') drop database Demo ...
- ubuntu更新问题
ubuntu 下出现E: Sub-process /usr/bin/dpkg returned an error code 在用apt-get安装软件时出现了类似于install-info: No d ...
- sql标签和include标签的使用
<sql>用来封装SQL语句, <include>用来调用<sql>封装的语句 代码片段: <sql id="select"> SE ...
- python 异常处理技巧
- 基于opencv的RandomForest随机森林
2.OpenCV函数使用 OpenCV提供了随机森林的相关类和函数.具体使用方法如下: (1)首先利用CvRTParams定义自己的参数,其格式如下 CvRTParams::CvRTParams(in ...
- XML之DOM解析文档 Day24
TestDom.java package com.sxt.dom; import java.io.File; import java.io.IOException; import javax.xml. ...
- 二分查找 Day08
package com.sxt.arraytest2; /* * 二分查找 前提:有序 */ public class TestBinarySearch { public static void ma ...