博客
关于我
N皇后问题
阅读量:261 次
发布时间:2019-03-01

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

N-皇后问题是一个经典的递归问题,常用于测试程序的深度和广度。以下是用C++实现的递归解决方案的代码解析和说明。

基本思路

N-皇后问题的目标是用最少的皇后在棋盘上占据每一行、每一列和每一条对角线。解决这个问题的常用方法是递归回溯算法。每次递归选择一个位置放置皇后,然后检查是否与已放置的皇后冲突。若没有冲突,则继续递归;否则,回溯。

代码解析

#include 
#include
using namespace std;int queen[100], n;void nqueen(int k) { if (k == n + 1) { for (int i = 1; i <= n; i++) cout << setw(4) << queen[i]; cout << endl; return; } for (int i = 1; i <= n; i++) { int j; for (j = 1; j < k; j++) if (queen[j] == i || abs(queen[j] - i) == abs(k - j)) break; if (j == k) { queen[k] = i; nqueen(k + 1); } }}int main() { cin >> n; nqueen(1);}

递归思路

  • 递归终止条件:当递归深度达到n+1时,表示所有皇后已被安置。此时,输出当前皇后位置。
  • 选择位置:从1到n的行中选择位置放置第k个皇后。
  • 检查冲突:检查当前位置是否与已放置的皇后在同一列、同一对角线或反对角线上存在冲突。
  • 回溯:如果位置安全,可放置皇后并递归解决下一个位置。
  • 优化解释

    • 递归深度:递归深度为n+1,确保能够遍历所有可能的皇后位置。
    • 检查冲突:使用绝对值检查对角线冲突,保证每一步都放置安全的位置。
    • 输出结果:在递归终止时输出全部位置,方便结果验证。

    代码改进

  • 避免全局变量:将queenn改为函数参数,提升代码的可维护性。
  • 优化循环:减少不必要的循环,提高运行效率。
  • 使用setw:确保输出格式美观,便于阅读。
  • 总结

    通过递归回溯算法,解决N-皇后问题时需要注意递归终止条件、冲突检查和回溯机制。本代码清晰地展示了这些关键点,适合用来理解递归解决复杂问题的思路。

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

    你可能感兴趣的文章
    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
    查看>>
    OSChina 周五乱弹 ——吹牛扯淡的耽误你们学习进步了
    查看>>
    OSChina 周四乱弹 ——程序员为啥要买苹果手机啊?
    查看>>
    OSChina 技术周刊第十期,每周技术抢先看!
    查看>>
    OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
    查看>>
    Osgi环境配置
    查看>>
    OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
    查看>>
    OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
    查看>>
    OSG学习:几何对象的绘制(二)——简易房屋
    查看>>
    OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
    查看>>
    OSG学习:场景图形管理(一)——视图与相机
    查看>>
    OSG学习:场景图形管理(三)——多视图相机渲染
    查看>>
    OSG学习:场景图形管理(二)——单窗口多相机渲染
    查看>>
    OSG学习:场景图形管理(四)——多视图多窗口渲染
    查看>>
    OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
    查看>>
    Sql 随机更新一条数据返回更新数据的ID编号
    查看>>
    OSG学习:空间变换节点和开关节点示例
    查看>>
    OSG学习:纹理映射(一)——多重纹理映射
    查看>>
    OSG学习:纹理映射(七)——聚光灯
    查看>>
    OSG学习:纹理映射(三)——立方图纹理映射
    查看>>