递推路径:马拦过河卒

来源:互联网 发布:js删除指定cookie 编辑:程序博客网 时间:2024/05/29 18:49
 

马拦过河卒

问题描述:


棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A(0, 0)B(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
一行四个数据,分别表示B点坐标和马的坐标。

6 6 3 3

一个数据,表示所有的路径条数。

6

每个测试点1s


问题评级:农夫山泉题(水题)


水题来说一般都是练习语法和思维的,在这里运用的到了一个新的做法,以供借鉴。

对于这个问题来说求马所控制的坐标是关键,可以一个一个来改写二维数组中的数据,也不会太过于麻烦,但是我这里采用了更巧妙的方法,用数组来保存马控制坐标的相对位置,只需写一个循环,用马的坐标加上对应的相对位置就能改变二维数组中的数据。

另一个关键问题就是数组出界的判断,在有些IDE中会自动隐藏这些数组出界的问题,但是在线评测系统可不会这样智能的帮你判断出界,所以在对数组下标进行操作时一定要进行出界判断。

所运用到的数学思想:

到一结点的路径条数 =它上面和左面结点的路径和

C代码:

 

#include <stdio.h>int a[21][21];int x[8]={-2,-2,-1,-1,1,1,2,2};int y[8]={-1,1,-2,2,-2,2,1,-1};int main(){int m,n;int hx,hy;int i,j;scanf("%d%d%d%d",&n,&m,&hx,&hy);a[0][0]=1;//起点置为1if(hy<=20&&hx<=20)a[hy][hx]=-1;//马控制的范围置为-1来区别对待for(i=0;i<8;i++) {if((y[i]+hy)>=0&&(y[i]+hy)<=20&&(x[i]+hx)>=0&&(x[i]+hx)<=20) {a[y[i]+hy][x[i]+hx]=-1;//马控制的范围置为-1来区别对待}}for(i=0;i<20;i++) {for(j=0;j<20;j++) {if(a[i][j]==-1)a[i][j]=0;//遍历到马控制的范围时置为0,表示共有0条路径可以到达这里else {if(i>=1)a[i][j]+=a[i-1][j];//能到达当前结点的路径条数=其左边结点的路径条数+其上面结点的路径条数if(j>=1)a[i][j]+=a[i][j-1];//}}}printf("%d\n",a[m][n]);return 0;}


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果的发票丢了怎么办 苹果7p开不开机怎么办 申请退款了怎么卖家还发货怎么办 买家申请退款卖家不退款怎么办 卖家恶意不退款怎么办 欠条到期了对方不还钱怎么办 冰箱磕了一坑怎么办 办信用卡没有家庭地址的怎么办 钱付了货没收到怎么办 在苏宁易购上买东西地址错了怎么办 手机分期付款银行卡丢了怎么办 华硕笔记本鼠标不动了怎么办 韵达快递不派送怎么办 中通快递不派送怎么办 农业银行信用卡密码输错三次怎么办 农业银行卡多次输错密码怎么办 想把店长弄走怎么办 济南银座卡过期了怎么办 银座购物卡丢失后怎么办 银座的卡丢了怎么办 银行卡换了旧卡怎么办 大理市民卡丢了怎么办 市民卡内的钱怎么办 宝付支付乱扣款怎么办 苏宁任性贷逾期怎么办 第二次跟家里开口要钱还网贷怎么办 网贷到家来要钱怎么办 网贷贷不了啦急要钱怎么办 百度推广竞价关键词太长怎么办 药店位置差客流少怎么办 网站上的用词违规怎么办 苹果16g内存不够怎么办 手机16g内存不够怎么办 在私企年纪大了怎么办 谷歌浏览器显示不安全打不开怎么办 4s密码多次错误怎么办 苹果4s手机系统错误怎么办 汽车充电口坏了怎么办 如果手机充不了电怎么办 淘宝买的家电坏了怎么办 衣服皱了没有熨斗怎么办