1314:【例3.6】过河卒(Noip2002)

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 15966     通过数: 6732

【题目描述】

棋盘上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

【分析】

看到棋盘,可能首先想到深搜,事实上,这道题用深搜时,当n、m=15时,就会超时。本题稍加分析就能发现,要到达棋盘上的一个点 ,只能从左边过来(称之为左点)或是从上面过来(称之为上点),所以根据加法原理,到达某一点的路径数目,就等于到达其相邻的上点和左点的路径数目之和,因此我们可以逐列(或逐行)递推的方法来求出从起点到终点的路径数目。障碍点(马的控制点)也完全适用,只要将到达该点的路径数目设置为0即可。

用f[i][j]表示到达点(i,j)的路径数目,g[i][j]表示点(i,j)有无障碍,g[i][j]=0表示无障碍,g[i][j]=1表示有障碍。则递推关系是如下:f[i][j]=f[i-1][j]+f[i][j-1]    // i>0 且 j>0 且 g[i][j]=0;递推边界有4个:

f[i][j]=0                 // g[i][j]=1

f[i][0]=f[i-1][0]       // i>0 且 g[i][0]=0

f[0][j]=f[0][j-1]       // j>0 且 g[0][j]=0

f[0][0]=1

考虑到最大情况下,n=20,m=20,路径条数可能会超过2^31-1,所以要采用高精度。

【参考代码】

#include <stdio.h>
#define MAXM 25
#define MAXN 25
int g[MAXM][MAXN];        //访问数组,表示点(i,j)有无障碍,0无障碍,1有障碍
int dir[8][2]={{-2,-1},{-1,-2},{2,-1},{1,-2},{2,1},{1,2},{-1,2},{-2,1}}; //方向数组
long long f[MAXM][MAXN];    //棋盘数组,到达点(i,j)的路径数目 int n,m;    //棋盘大小
int x,y;    //马的坐标int main()
{int i,j,nx,ny;scanf("%d%d%d%d",&n,&m,&x,&y);//处理马控制的点g[x][y]=1;       //x,y不能走f[0][0]=1; for(i=0;i<8;i++){nx=x+dir[i][0];ny=y+dir[i][1];if(nx>=0 && nx<=n && ny>=0 && ny<=m)g[nx][ny]=1;  //不能走 }for(i=1;i<=n;i++){ if(g[i][0])break;elsef[i][0]=1;} for(i=1;i<=m;i++){if(g[0][i])break;elsef[0][i]=1;}for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(g[i][j]==0)f[i][j]=f[i-1][j]+f[i][j-1];printf("%lld\n",f[n][m]);return 0;
}

http://ybt.ssoier.cn:8088/problem_show.php?pid=1314

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

  1. 信息学奥赛一本通 1314:【例3.6】过河卒(Noip2002) | 1921:【02NOIP普及组】过河卒 | 洛谷 P1002 [NOIP2002 普及组] 过河卒

    [题目链接] ybt 1314:[例3.6]过河卒(Noip2002) ybt 1921:[02NOIP普及组]过河卒 洛谷 P1002 [NOIP2002 普及组] 过河卒 [题目考点] 1. 坐标 ...

  2. 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02

    /* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...

  3. 【例8】合唱队形(《信息学奥赛一本通第五版》)

    /* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...

  4. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

  5. 信息学奥赛一本通(2032:【例4.18】分解质因数)

    2032:[例4.18]分解质因数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 582     通过数: 376 [题目描述] 把一个合数分解成若干个质因数乘积 ...

  6. 信息学奥赛一本通——2062:【例1.3】电影票

    2062:[例1.3]电影票 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 57341     通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...

  7. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制

    [题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...

  8. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

  9. 信息学奥赛一本通C++语言-----2036:【例5.3】开关门

    [题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...

最新文章

  1. codis3数据迁移探索
  2. Bootstrap 基本模板
  3. The DVMM Lab at Columbia University
  4. YbOJ-网格序列【拉格朗日插值】
  5. 解决水晶报表部署时出错的问题
  6. java php 等,路径 上级路径,上上级路径表示方法
  7. 青岛计算机学校分数线,青岛计算机应用与维修专业职业学校收费标准,物联网应用技术中专学校分数线...
  8. jquery 选择器 逗号
  9. mmdetection学习之anchor_generator
  10. 【雕爷学编程】Arduino动手做(45)---红外避障传感器
  11. jarvis oj typo
  12. 【高速PCB电路设计】5.布局要点
  13. ipad上编程方法,服务器安装vscode
  14. 论war3中的随机数系统
  15. git 删除远程仓库命令
  16. 配置sumlime html,Sublime Text 3使用SublimeLinter配置JS,CSS,HTML语法检查
  17. sqlite奇怪错误SQL logic error
  18. 学会读懂traceback,处理Python异常
  19. 浅谈 CRTP:奇异递归模板模式
  20. python字典添加元素的2种方法_python中怎么向字典添加元素

热门文章

  1. 什么是机器学习?有哪些分类?怎样上手开发?终于有人讲明白了
  2. 大数据杀熟!用苹果手机怪我咯?
  3. 脉冲波形的变换与产生
  4. 卸载虚拟机出现用户已存在的错误_BATJ面试必会|Jvm 虚拟机篇
  5. 别再用硬编码写业务流程了,试试这款轻量级流程编排框架
  6. 漫话:为什么程序员喜欢使用0 ≤ i 10这种左闭右开的形式写for循环?
  7. 阿里云首次公布年度3大战略方向,中台做厚,做强生态,还要再招5000人
  8. 浪费了4年后,公司的产品小哥去快手搞 Java 了
  9. 【JEECG Dubbo专题】jeecg-p3集成dubbo文档
  10. 删除oracle表里的重复记录