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)的更多相关文章

  1. 过河卒(Noip2002)(dp)

    过河卒(Noip2002) 时间限制: 1 Sec  内存限制: 128 MB提交: 7  解决: 6[提交][状态][讨论版][命题人:quanxing] 题目描述 棋盘上A点有一个过河卒,需要走到 ...

  2. 过河卒(NOIP2002)

    题目链接:过河卒 直接模拟?会T掉60分. 所以我们可以采用递推,怎么想到的? 因为卒子只能向下或向右走,所以走到一个点的方法数,等于走到它上面点的方法数加上走到它左边点的方法数,这样就可以地推了. ...

  3. 【openjudge】【递推】例3.6 过河卒(Noip2002)

    [题目描述] 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1 ...

  4. LFYZ-OJ ID: 1020 过河卒(NOIP2002)

    过河卒 Proble Description 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃 ...

  5. noip2002 普及组 过河卒

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

  6. NOIP2002 过河卒(DFS,DP)

    https://www.luogu.org/problem/P1002 题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如 ...

  7. AC日记——过河卒 洛谷 1002

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

  8. NOIP 2002过河卒 Label:dp

    题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例如 ...

  9. ACM题目————马拦过河卒

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

随机推荐

  1. C#创建日志方法

    1.通过流的方式 public void WriteLog(string log) { StreamWriter stream; string path = "D:/WriteLog/&qu ...

  2. 对象无法注册到Spring容器中,手动从spring容器中拿到我们需要的对象

    当前对象没有注册到spring容器中,此时无法new object()  的方式创建对象,否则所有@Autowired 注入的对象都为null; 处理方式: 手动创建一个类@Component注册到S ...

  3. jQuery纵向分类下拉菜单导航

    在线演示 本地下载

  4. No PostCSS Config found解决办法

    npm install报错 Module build failed: Error: No PostCSS Config found 解决办法是同级package.json文件新建postcss.con ...

  5. Pyhton 单行、多行注释方法

    一.python单行注释的符号 井号#常被用作单行注释符号,在代码中使用#时,它右边的任何数据都会被忽略,当做是注释.类似c++的// 二.批量.多行注释的符号 多行注释是用三引号: ”’ 注释内容 ...

  6. Servlet会话跟踪和Cookies及HttpSession会话

    会话只是指一段指定的时间间隔. 会话跟踪是维护用户状态(数据)的一种方式.它也被称为servlet中的会话管理. Http协议是一个无状态的,所以我们需要使用会话跟踪技术来维护用户状态. 每次用户请求 ...

  7. Java练习 SDUT-2499_数字

    数字 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 定义f(x) = {比x小,不可以被x整除并且不和x互质的数的个数 ...

  8. 纯CSS3打造圆形菜单

    原理是使用相对定位和绝对定位确定圆形菜单位置. 使用伪类选择器E:hover确定悬浮时候的效果,动画效果用CSS3的transition属性. 大概代码如下. html: <div id=&qu ...

  9. 【机器学习】Iris Data Set(鸢尾花数据集)

    [机器学习]Iris Data Set(鸢尾花数据集) 注:数据是机器学习模型的原材料,当下机器学习的热潮离不开大数据的支撑.在机器学习领域,有大量的公开数据集可以使用,从几百个样本到几十万个样本的数 ...

  10. 【转载】使用 gnuplot 在网页中显示数据

    来源:http://www.ibm.com/developerworks/cn/aix/library/au-gnuplot/ 简介 gnuplot 是一个用于生成趋势图和其他图形的工具.它通常用于收 ...