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

本文共 1121 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    no session found for current thread
    查看>>
    No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
    查看>>
    NO.23 ZenTaoPHP目录结构
    查看>>
    no1
    查看>>
    NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
    查看>>
    NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
    查看>>
    Node JS: < 一> 初识Node JS
    查看>>
    Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime(72)
    查看>>
    node, nvm, npm,pnpm,以前简单的前端环境为什么越来越复杂
    查看>>
    Node-RED中使用JSON数据建立web网站
    查看>>
    Node-RED中使用json节点解析JSON数据
    查看>>
    Node-RED中使用node-random节点来实现随机数在折线图中显示
    查看>>
    Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
    查看>>
    Node-RED中使用node-red-contrib-image-output节点实现图片预览
    查看>>
    Node-RED中使用node-red-node-ui-iframe节点实现内嵌iframe访问其他网站的效果
    查看>>
    Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
    查看>>