前面几节讲述了递归的一般应用,本节讲一下递归的另一个重要的应用场合回溯算法,利用函数调用的活动对象可以保存回溯算法中重要的变量信息 。

递归与回溯

递归在程序设计中也常用于需要回溯算法的场合。
回溯算法的基本思想:
1.从问题的某一种状态出发,搜索可以到达的所有状态;
2,当某个状态到达后,可向前回退,并继续搜索其它可达状态;
3.当所有状态都到达后,回溯算法结束。
程序设计中可利用函数的活动对象保存回溯算法的状态数据,因此可以利用递归完成回溯算法。 对于回溯算法我们可以研究一个经典的问题,八皇后问题:在一个8×8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。

要想实现此算法,首先得初始化一个8*8的棋盘,代码如下:

#define N 8
// 定义一个二维数组,模拟棋盘
static char board[N+2][N+2];void init()
{int i = 0;int j = 0;// #号代表棋盘边沿for(i=0; i<N+2; i++){board[0][i] = '#';board[N+1][i] = '#';board[i][0] = '#';board[i][N+1] = '#';}// 棋盘方格用空格代替for(i=1; i<=N; i++){for(j=1; j<=N; j++){board[i][j] = ' ';}}
}

棋盘光模拟出来还不行,还需要将其打印出来:

void display()
{int i = 0;int j = 1;for(i=0; i<N+2; i++){for(j=0; j<N+2; j++){printf("%c", board[i][j]);}printf("\n");}
}

打印结果如图:

至此,棋盘已经模拟出来并且可以显示了,我们就要寻找皇后的放置位置,在这之前得检测指定位置是否可以放置皇后,查找的方法:

1.查找该位置的前一行的当前列及左右对角线是否有皇后;

2.如果有该位置就不可以防止皇后,否则,可以放置皇后。

图示如下(黄底红字的就是需要检测的位置):

实现代码如下:

typedef struct _tag_Pos
{int ios;int jos;
} Pos;
// 定义一个结构体数组,存放寻找可否放置皇后位置偏移量
static Pos pos[] = { {-1, -1}, {-1, 0},{-1, 1} };// 可以放置皇后返回1,否则返回0
int check(int i, int j)
{int ret = 1;int p = 0;for(p=0; p<3; p++){int ni = i;int nj = j;//在棋盘范围内,不等于×号的位置表示可以放置皇后while( ret && (board[ni][nj] != '#') ){ni = ni + pos[p].ios;nj = nj + pos[p].jos;ret = ret && (board[ni][nj] != '*');}}return ret;
}

寻找皇后方法的算法如下:

1.初始化:i = 1
2. 初始化:j = 1
3. 从第i行开始,恢复j的当前值,判断第j个位置
 a. 位置j可放入皇后:标记位置(i, j), i++,转步骤2
 b. 位置j不可放入皇后:j++, 转步骤a
 c. 当j>8时,i--,转步骤3

4. 结束:第8行有位置可放入皇后 ,打印棋盘现状。

代码如下:


static int count = 0;
void find(int i)
{int j = 0;if( i > N ){count++;printf("Solution: %d\n", count);display();printf("按回车键打印其他摆放方式");getchar();}else{for(j=1; j<=N; j++){if( check(i, j) ){board[i][j] = '*';find(i+1);board[i][j] = ' ';}}}
}
int main()
{init();find(1);return 0;
}

运行结果如下:

递归应用C语言实现

数据结构之栈与递归的应用(八皇后递归解法)相关推荐

  1. 还记得八皇后的解法吗

    "还记得八皇后的解法吗?" "上个世纪的事情,不记得了." "-- 现在回忆一下?" "开会,回头说." " ...

  2. 递归/回溯:八皇后问题N-Queens

    N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...

  3. 递归回溯解决八皇后问题

    文章目录 前言 八皇后问题 问题解析 代码实现 完整代码 前言 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇 ...

  4. 递归--基于回溯和递归的八皇后问题解法

    八皇后问题是在8*8的棋盘上放置8枚皇后,使得棋盘中每个纵向.横向.左上至右下斜向.右上至左下斜向均只有一枚皇后.八皇后的一个可行解如图所示:                             ...

  5. 递归应用:八皇后问题

    八皇后问题介绍 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行 ...

  6. 数据结构与算法-- 八皇后问题(多种实现方案)

    八皇后问题解法一(排列筛选法) 本篇我们承接上一篇中的思想,想到了一个经典的算法题,八皇后问题: 题目:在8*8的国际象棋上摆放8个皇后,使得其互相不能攻击,即任意两个换后不能在同一行,同一列,或者同 ...

  7. 【恋上数据结构】回溯、剪枝(八皇后、n皇后)、LeetCode51.N皇后、LeetCode52.N皇后 II

    回溯 回溯(Back Tracking) 提出八皇后问题(Eight Queens) 初步思路一:暴力出奇迹 初步思路二:根据题意减少暴力程度 初步思路三:回溯法(回溯+剪枝) 四皇后 - 回溯法图示 ...

  8. 递归求解全排列问题以及八皇后问题

    文章目录 全排列问题简介 思路及代码 八皇后问题简介 代码 八皇后代码改进 全排列问题简介 对于全排列问题,我们要做的事是讲1~n个数进行排列组合,并按照字典序由小到大的顺序输出.这个问题的复杂度是O ...

  9. 算法学习笔记之三:八皇后问题(递归、回溯)

    (一)题记 从去年下半年开始找工作,大大小小也被"鄙"试."面"试了n多回了.说实话只怪自己并未对常见的笔试题.面试题进行准备,导致败下阵来.一门学问要想学透学 ...

最新文章

  1. rac环境改动spfile后遭遇ora-29250小例
  2. python文件目录操作操作_Python基础之文件目录操作
  3. 禁止vim生成 un~文件
  4. 离线安装minikube—1.10.1
  5. android异步加载视频缩略图,swift-如何将视频URL的缩略图异步加载到tableview列表中...
  6. 数据结构及算法总结(概述)
  7. [论文阅读] Prototype Augmentation and Self-Supervision for Incremental Learning
  8. 创建线程方式2-runnable接口的实现类
  9. 【PAT乙】1001 害死人不偿命的(3n+1)猜想 (15分) 模拟,水水更健康
  10. 安卓手机运行ios教程_英雄联盟手游日服怎么注册?安卓/ios注册下载教程! 18183手机游戏网...
  11. “SCSA-S学习导图+”系列:Windows下的WEB系统环境搭建
  12. matlab freqz-m,Matlab函数freqs和freqz
  13. php trim /r/n,「php中trim函数使用」- 海风纷飞Blog
  14. 安卓判断手机GPS是否打开,未打开时跳去手机设置开启GPS的方法
  15. 国税总局增值税发票查验平台验证码识别深度学习实战
  16. 自考本科英语(二)学习笔记和考试经验
  17. Win10打包tar.gz文件,Win10使用tar命令,Win10使用linux基本命令
  18. 多级放大电路的一般问题(耦合方式+动态分析)详解
  19. 3G上网:按时长计费是运营商的“最佳选择”
  20. 手把手教您使用北美打折返利网

热门文章

  1. 轮距和轴距有什么区别_大热的“机能风”是什么?看完领克02 PHEV你就懂了
  2. ios mysql数据库查询语句_ios fmdb数据库查询语句
  3. pandas tqdm添加进度条
  4. git mysql差异备份_结合Git实现Mysql差异备份,可用于生产环境
  5. eureka 集群失败的原因_对于注册中心,ZooKeeper、Eureka哪个更合适?
  6. 什么都不懂的学java难不难_零基础转行学java到底难不难
  7. core控制器属性注入的用处_asp.net-core – 如何使用Autofac和ASP.NET Core在控制器上启用属性注入?...
  8. spring MVC 项目 WEB-INF下的jsp不能加载css文件
  9. Intellij IDEA 配置
  10. day 7-13 数据库的数据类型