递推递归练习 L 马拦过河卒
来源:互联网 发布:免费服务器防火墙软件 编辑:程序博客网 时间:2024/06/04 23:30
Description
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
Input
一行四个数据,用空格分隔,分别表示B点的坐标和马的坐标。
Output
一个数据,表示所有的路径条数。
Sample Input
6 6 3 3
Sample Output
6
这道题我做了好长好长时间,有些动态规划的思想
如要到达a[1][2]只能从a[0][2]或a[1][1]过来,到a[1][1]有两条路(到a[1][1]的两条是到a[0][1]的一条与到a[1][0]的一条加起来得到的,以此类推),到a[0][2]有一条,加起来就是三条。
实现的时候可以将马的控制点设为0,或遇马的控制点就跳过循环。代码如下:
#include <iostream>using namespace std;int a[21][21] = {0};int main(){ int i, j, m, n, x, y; cin>>n>>m>>x>>y; a[x][y]=-1; if(x - 1 >= 0 && y - 2 >= 0) a[x-1][y-2] = -1; if(x - 2 >= 0 && y - 1 >= 0) a[x-2][y-1] = -1; if(x - 2 >= 0 && y + 1 <= m-1) a[x-2][y+1] = -1; if(x - 1 >= 0 && y + 2 <= m-1) a[x-1][y+2] = -1; if(x + 1 <= n && y + 2 <= m) a[x+1][y+2] = -1; if(x + 2 <= n && y + 1 <= m) a[x+2][y+1] = -1; if(x + 2 <= n && y - 1 >= 0) a[x+2][y-1] = -1; if(x + 1 <= n && y - 2 >= 0) a[x+1][y-2] = -1; for(i = 0; i <= n; i++) { for(j=0;j<=m;j++) { if(a[i][j]==-1) continue; if(i==0&&j==0) { a[i][j]=1; continue; } a[i][j]=0; if(j-1>=0&&a[i][j-1]!=-1) a[i][j]+=a[i][j-1]; if(i-1>=0&&a[i-1][j]!=-1) a[i][j]+=a[i-1][j]; } } if(a[n][m] == -1) cout << 0; else cout << a[n][m];}
0 0
- 递推递归练习 L 马拦过河卒
- 递推递归练习L马拦过河卒
- 递推递归练习--L(马拦过河卒)
- 递推递归练习 L
- 递推递归练习L
- 递归递推练习 L
- 递推递归练习L
- 递推递归练习 N 青蛙过河
- 递推递归练习N青蛙过河
- 递推递归练习--N(青蛙过河)
- 递归递推之马拦过河卒
- 递推递归练习 中的L题
- ACM递归递推练习 Problem L
- 递推路径:马拦过河卒
- 马拦过河卒 递推
- 递推----马拦过河卒
- 递推递归-L
- 【递推】过河卒
- Photoshop从新手到高手阶段性学习
- 如何压缩减小少APK安卓安装包大小
- 华为武长区笔试2017
- 线程同步与互斥(一)
- ASP.NET实现日期转为大写的汉字
- 递推递归练习 L 马拦过河卒
- 分享一些常见的浏览器兼容性问题
- Android 属性动画的使用
- 【OpenCV】查找表用法以及LUT函数的使用
- AndroidStudio 插件
- Android的开机流程及对应源码位置分析
- 2017华为实习机试题(java)
- QuartusII9.0的安装与破解
- Intersection of Two Linked Lists问题及解法