问题描述:

在半张中国象棋的棋盘上,一匹马从左下角跳到右上角,只允许往右跳,不允许往左跳,问有多少种方案。(《算法设计与分析》王幸民 张晓霞编著,第二章习题 2.11 跳马问题)

问题分析:

中国象棋的棋盘是 8×8 格规模大小,半张棋盘就是 8×4 格规模大小,如图所示。由题意得棋子要从 (0,0) 位置走到 (8,4) 位置。取值范围 0≤x≤8,0≤y≤4。

由马的走步规则可知:

第一步:(1,2) 或 (2,1)

第二步:(2,4)、(3,3)、(3,1)、(2,0) 或 (3,3)、(4,2)、(4,0)

......

可总结出规律:

向右走一格或者两格,向上走一格或者两格,向下走一格或者两格。

x=( i+1, j±2 ),y=( i+2, j±1 )

源代码如下:

#include<iostream>
using namespace std;//用来记录每一步的状态
//从初始位置开始要走 8步才能到达终点所以数组长度设为 9
int ax[9],ay[9];//用来表示行走的方向
//对于 y轴坐标正值表示向上走负值表示向下走
//第一维表示向右走几个单位的距离
//第二维表示向上或向下走几个单位的距离
int dir[4][2]={{1,2},{1,-2},{2,1},{2,-1}}; //用来记录方案个数
int count=0;//判断马的走步是否在棋盘范围内
bool inMap(int x,int y){return x>=0 && x<=8 && y>=0 && y<=4;
} //output函数用于输出从第 0步到第 n步的方案
void output(int n){cout<<"0 0"; //初始位置 for(int i=1;i<=n;i++){cout<<" → "<<ax[i]<<" "<<ay[i];}cout<<endl;
}//搜索遍历所有的方案
void findRoad(int n){int x1=ax[n],y1=ay[n]; //(x,y)用来表示当前位置 if(x1==8) { //说明已经到达最右边if(y1==4){ //说明走到了终点(8,4) output(n);count++;}}for(int i=0;i<4;i++){ //遍历 4个方向int x2=x1+dir[i][0];int y2=y1+dir[i][1]; //(x2,y2)是(x1,y1)能走到的 4个点之一if(inMap(x2,y2)){ax[n+1]=x2; //ax[n+1]更新为 x2ay[n+1]=y2; //将 ay[n+1]更新为 y2findRoad(n+1); //设置到第 n+1步再进 findRoad(n+1)去设置第 n+2步(深度优先搜索) }}
}int main(){findRoad(0); //从(0,0)开始扩展 cout<<"共有"<<count<<"种方案!"<<endl;return 0;
} 

跳马问题C++递归调用相关推荐

  1. python 递归调用

    2019独角兽企业重金招聘Python工程师标准>>> 解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的. ...

  2. with as递归调用

    一.递归调用--在代码中偶尔看到以记之,便于下次学习 https://blog.csdn.net/johnf_nash/article/details/78681060 --查询节点及其下所有子节点 ...

  3. 编写递归调用的Lambda表达式

    前段时间,我写一个树的访问算法的时候,用了Visitor模式把访问的算法分离了出来,当时打算用lambda表达式写visit算法的,却发现带递归调用的lambda表达式没想象的那么好写,憋了半天愣是没 ...

  4. SSM 返回静态页面HTML Controller 被递归调用引起的StackOverflowError

    一 背景 最近在做工程实践,想实现这么一个效果: 前端url请求地址:localhost:8080/idevtools/search 后端返回一个静态页面HTML:search.html 按照网上说的 ...

  5. return 和 方法的递归调用

    return语句直接结束方法 方法的递归调用: 递归调用是一种特殊的调用形式,是方法自己调用自己,如图所示: 例子:完成数字的累加操作,除了循环操作以外还可以使用递归调用: 代码: package W ...

  6. Python函数的递归调用

    一:递归的定义 函数的递归调用:是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或者间接地调用到本身 # 直接调用本身 def f1():print('是我是我还是我')f1() ...

  7. 方法的定义使用,方法重载及方法的递归调用

    方法 1.方法的定义与使用 2.方法的重载 3.方法的递归调用 3.1栈溢出 1.方法的定义与使用 定义一个没有参数值,没有返回值的方法 定义一个有参数无返回值的方法 定义 有返回值,有参数的方法 p ...

  8. C语言程序设计 函数递归调用示例

    函数递归调用示例(教材习题5.3,运行结果012345) #include<stdio.h> void fun(int k); void main() {   int w=5;   fun ...

  9. 如何用堆栈和循环结构代替递归调用--递归转换为非递归的10条军规

    10 Rules (steps) for replacing the recursive function with stack and while-loop 转自http://www.codepro ...

  10. 前端基础12:递归调用,快速排序和简单DOM元素操作

    递归调用 递归调用,方法自己调用自己(重复执行方法中的逻辑) 1.在方法内部调用自己的方法写在return 2.设置边界条件,让递归调用停下来 function fn(n) {if(n == 1){r ...

最新文章

  1. Spring Cloud Alibaba即将正式毕业,Netflix之后新生力量值得期待!
  2. 2013年全国首届CISA认证培训强化班成功举办
  3. windows编程一日一练(2)
  4. linux设置history历史记录
  5. 牛客网暑期ACM多校训练营(第九场)
  6. 【送给Git初学者】
  7. 100家店干翻17000家药店!刘强东最恐惧的对手来了!
  8. android 生成apk名字自动已,Jenkins打包android应用时自动签名apk详解
  9. oracle请求界面,Oracle EBS如何enable 请求界面 View XML按钮
  10. 如何设置Win11账户密码有效期?Win11账户密码使用期限设置教程
  11. Leetcode 385.字典序排序
  12. ThinkPad SL400 改装Win2003方法以及驱动下载列表
  13. 剑指 Offer 47. 礼物的最大价值
  14. C语言程序 输出杨辉三角,C语言打印输出杨辉三角
  15. xilinx zynq zynqmp nvme SSD使用
  16. c语言计算乘方不使用乘法,C语言乘方运算之矩阵乘方题解
  17. 像人类大脑一样思考 ,“袋鼠云防汛大脑”让防汛更智慧
  18. 混合颜色带的应用(二)
  19. 分子对接教程 | (8) PyMOL可视化对接结果
  20. mysql 空间数据操作,MySQL 空间数据 简单操作

热门文章

  1. 高效实现统计分析(按日,月,周)查询功能
  2. 定制Android关机界面
  3. 中国大学慕课第9周测验
  4. 交易开拓者-附录一:计算公式
  5. 网站入侵工具之wscan使用详解
  6. BZOJ 5442: [Ceoi2018]Global warming
  7. 改进YOLOv5系列:首发结合 RepLKNet 构建 最新 RepLKDeXt 结构|CVPR2022 超大卷积核, 越大越暴力,大到31x31, 涨点高效
  8. coreldraw梯形校正_CorelDRAW绘制等腰梯形的多种方法
  9. ajax readystate为1,Ajax readyState总是等于1
  10. 推荐一个爬虫神器:You-Get,小白也会用