跳马问题C++递归调用
问题描述:
在半张中国象棋的棋盘上,一匹马从左下角跳到右上角,只允许往右跳,不允许往左跳,问有多少种方案。(《算法设计与分析》王幸民 张晓霞编著,第二章习题 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++递归调用相关推荐
- python 递归调用
2019独角兽企业重金招聘Python工程师标准>>> 解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的. ...
- with as递归调用
一.递归调用--在代码中偶尔看到以记之,便于下次学习 https://blog.csdn.net/johnf_nash/article/details/78681060 --查询节点及其下所有子节点 ...
- 编写递归调用的Lambda表达式
前段时间,我写一个树的访问算法的时候,用了Visitor模式把访问的算法分离了出来,当时打算用lambda表达式写visit算法的,却发现带递归调用的lambda表达式没想象的那么好写,憋了半天愣是没 ...
- SSM 返回静态页面HTML Controller 被递归调用引起的StackOverflowError
一 背景 最近在做工程实践,想实现这么一个效果: 前端url请求地址:localhost:8080/idevtools/search 后端返回一个静态页面HTML:search.html 按照网上说的 ...
- return 和 方法的递归调用
return语句直接结束方法 方法的递归调用: 递归调用是一种特殊的调用形式,是方法自己调用自己,如图所示: 例子:完成数字的累加操作,除了循环操作以外还可以使用递归调用: 代码: package W ...
- Python函数的递归调用
一:递归的定义 函数的递归调用:是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或者间接地调用到本身 # 直接调用本身 def f1():print('是我是我还是我')f1() ...
- 方法的定义使用,方法重载及方法的递归调用
方法 1.方法的定义与使用 2.方法的重载 3.方法的递归调用 3.1栈溢出 1.方法的定义与使用 定义一个没有参数值,没有返回值的方法 定义一个有参数无返回值的方法 定义 有返回值,有参数的方法 p ...
- C语言程序设计 函数递归调用示例
函数递归调用示例(教材习题5.3,运行结果012345) #include<stdio.h> void fun(int k); void main() { int w=5; fun ...
- 如何用堆栈和循环结构代替递归调用--递归转换为非递归的10条军规
10 Rules (steps) for replacing the recursive function with stack and while-loop 转自http://www.codepro ...
- 前端基础12:递归调用,快速排序和简单DOM元素操作
递归调用 递归调用,方法自己调用自己(重复执行方法中的逻辑) 1.在方法内部调用自己的方法写在return 2.设置边界条件,让递归调用停下来 function fn(n) {if(n == 1){r ...
最新文章
- Spring Cloud Alibaba即将正式毕业,Netflix之后新生力量值得期待!
- 2013年全国首届CISA认证培训强化班成功举办
- windows编程一日一练(2)
- linux设置history历史记录
- 牛客网暑期ACM多校训练营(第九场)
- 【送给Git初学者】
- 100家店干翻17000家药店!刘强东最恐惧的对手来了!
- android 生成apk名字自动已,Jenkins打包android应用时自动签名apk详解
- oracle请求界面,Oracle EBS如何enable 请求界面 View XML按钮
- 如何设置Win11账户密码有效期?Win11账户密码使用期限设置教程
- Leetcode 385.字典序排序
- ThinkPad SL400 改装Win2003方法以及驱动下载列表
- 剑指 Offer 47. 礼物的最大价值
- C语言程序 输出杨辉三角,C语言打印输出杨辉三角
- xilinx zynq zynqmp nvme SSD使用
- c语言计算乘方不使用乘法,C语言乘方运算之矩阵乘方题解
- 像人类大脑一样思考 ,“袋鼠云防汛大脑”让防汛更智慧
- 混合颜色带的应用(二)
- 分子对接教程 | (8) PyMOL可视化对接结果
- mysql 空间数据操作,MySQL 空间数据 简单操作
热门文章
- 高效实现统计分析(按日,月,周)查询功能
- 定制Android关机界面
- 中国大学慕课第9周测验
- 交易开拓者-附录一:计算公式
- 网站入侵工具之wscan使用详解
- BZOJ 5442: [Ceoi2018]Global warming
- 改进YOLOv5系列:首发结合 RepLKNet 构建 最新 RepLKDeXt 结构|CVPR2022 超大卷积核, 越大越暴力,大到31x31, 涨点高效
- coreldraw梯形校正_CorelDRAW绘制等腰梯形的多种方法
- ajax readystate为1,Ajax readyState总是等于1
- 推荐一个爬虫神器:You-Get,小白也会用