博客
关于我
N皇后问题解法(递归+回朔)
阅读量:639 次
发布时间:2019-03-15

本文共 1810 字,大约阅读时间需要 6 分钟。

解决八皇后问题的方法主要有两种:递归解法回溯解法。以下是两个方法的实现代码及详细说明:

#include 
#include
#define M 8 // 存在8个皇后bool check(int *c, int k) { int i = 0; for (i = k - 1; i >= 0; i--) { if (c[i] == c[k] || (c[i] - c[k] == i - k) || (c[i] + i == c[k] + k)) { return false; } } return true;}void display(int *c, int n) { int i = 0, j = 0; for (i = 1; i <= n; i++) { printf("%d ", c[i]); } printf("\n");}void q(int k) // 递归解法{ int i = 0; for (i = 1; i <= M; i++) { c[k] = i; if (check(c, k)) { if (k == M) // 到达最后一层,输出 { display(c, k); } else { q(k + 1); // 向下搜索 } } c[k] = 0; }}void qt(int k) // 回溯解法{ while (k >= 1) { while (c[k] < 0) { k--; } if (k == 1) { break; } int i = c[k - 1], j = k; k--; if (i <= j) { c[k] = c[k - 1]; c[k - 1] = -1; k++; } }}int main(void) { q(1); // 非递归 qt(1); // 递归 return 0;}

详细说明

1. 递归解法

递归解法采用深度优先搜索的方式进行,适用于问题结构分明的情况。具体步骤如下:

  • 建立索引数组:用于存储不同皇后位置的列索引。
  • 递归函数 q(int k):递归深度为k,依次尝试在第k行放置皇后。
    • 放置皇后:遍历各列,尝试将皇后放在当前行的不同列中。
    • 检查合法性:调用check函数,判断当前皇后是否与之前放置的皇后产生攻击。
    • 递归搜索:如果合法,继续递归处理下一行;否则,尝试下一列。
    • 输出结果:当达到第8行时,调用display函数输出当前解。

2. 回溯解法

回溯解法在每一步放置皇后后进行全面检查,剪枝不合法的情况,提高效率。具体步骤如下:

  • 初始化数组:如c[20],用于存储皇后位置。
  • 递归函数 qt(int k):从第k行开始尝试放置皇后。
    • 搜索上层:寻找上一行的放置位置。
    • 回溯检查:在第k行恢复已放置的皇后位置。
    • 尝试放置:检查当前列、行和对角线是否合法,并进行递归处理。
    • 终止条件:当最上一行也放置好皇后时,说明成功解开谜题。

优缺点对比

  • 递归解法:代码简单易读,容易实现,逻辑直观。缺点是:在解决复杂问题时,可能效率不高,且难以处理较大规模的棋盘。

  • 回溯解法:采用分治策略,较早剪枝,效率较高。优点是:代码结构复杂,搜索更深入,在某些复杂问题中表现优异。

3. 实现细节

  • 递归过程:递归函数切换解决不同行的放置顺序,通过修改全局变量实现状态的保存。
  • 回溯过程:在无法继续放置时,返回上一层,重新尝试其他可能性。
  • 合法性检查:函数check不仅检查列和行,还检查对角线的冲突,确保每一步都正确。

通过以上两种策略,可以有效地解决八皇后问题,并根据需求选择合适的解法。

转载地址:http://ymzmz.baihongyu.com/

你可能感兴趣的文章
如何使用SSH远程管理Linux服务器
查看>>
降级到旧版本macOS的3种方法
查看>>
学习Vue.js2.0(国外视频教程)
查看>>
在FPGA板上实现数字时钟的VHDL代码
查看>>
wxPython和PyOpenGL视频
查看>>
在30分钟内学习PHP
查看>>
Python http.server 服务器
查看>>
Python svm 支持向量机
查看>>
OpenStack 最小化安装配置(一):物理机网桥配置
查看>>
PS快速美白照片
查看>>
ubuntu 16.04 镜像下载
查看>>
CUDA9.1、cuDNN7在Ubuntu16.04上的安装
查看>>
解决“预编译器错误:代码使用了scss/sass语言,但未安装相应编译器,请在菜单工具-插件安装里安装相应编译插件”
查看>>
微信小程序云开发:怎么删除云函数?已解决
查看>>
解决微信小程序项目导入的问题:app.json 未找到、 __wxConfig is not defined
查看>>
什么是句柄(经典)
查看>>
非迅捷|PDF、Word、PPT、Excel、图片等互相在线转换:免费、简单、快速、零错误、无套路
查看>>
第一次被黑
查看>>
PyCharm配置anaconda环境
查看>>
修改linux 系统自带日志系统systemd-journald && 参数
查看>>