首页 > 编程语言 >C/C++ 数据结构五大核心算法之回溯法-N皇后问题

C/C++ 数据结构五大核心算法之回溯法-N皇后问题

时间:2023-08-05 15:22:34浏览次数:32  
标签:include return int C++ abs 回溯 皇后 数据结构

N皇后问题:在 n * n 的棋盘上要摆 n 个皇后,要求:任何两个皇后不同行,不同列也不在同一条斜线上,求给一个整数 n ,返回 n 皇后的摆法数。

#include <iostream>
#include <math.h>
#define N 8
using namespace std;
int q[N + 1];  //q[i]表示第i个皇后在第i行上的第q[i]列
int check(int j) { //检查N皇后摆放的位置是否合法
    for (int i = 1; i < j; i++) {
        if (q[i] == q[j] || abs(i-j)==abs(q[i]-q[j])) { //判断是否在同一列或同一斜线上
            return 0;
        }
    }
    return 1;
}
void queen() {
    for (int i = 1; i <= N; i++) {
        q[i] = 0;//初始化
    }
    int answer = 0;//方案数
    int j = 1; //表示正在摆放第j个皇后
    while (j >= 1) {
        q[j]++; //让第j个皇后向后一列摆放
        while (q[j]<=N && !check(j)) {//判断第j个皇后的位置是否合法
            q[j] = q[j]++; //不合法就往后一个位置摆放
        }
        if (q[j] <= N) { //表示第j个皇后找到一个合法的摆放位置
            if (j == N) {//找到了N皇后的一组解
                answer++;
                cout << "方案" << answer << ":";
                for (int i = 1; i <= N; i++) {
                    cout << q[i] << " ";
                }
                cout << endl;
            }
            else {
                j++;//继续摆放下一个皇后
            }
        }
        else {//表示第j个皇后找不到一个合法的摆放位置
            q[j] = 0;//还原第j个皇后的位置
            j--;//回溯
        }
    }
}
int main() {
    queen();

    system("pause");
    return 0;
}

标签:include,return,int,C++,abs,回溯,皇后,数据结构
From: https://www.cnblogs.com/smartlearn/p/17607993.html

相关文章

  • ITK在C++文件里面,可以这样调用开旁路的函数
    问题:如果直接在c++文件引入开旁路函数POM_AM__set_application_bypass,是编译不通过的(PS:好像是因为开旁路函数是用C写的,和C++不兼容,具体也不是很懂的,有懂的大佬,可以帮忙评论解答下) 解决方法:在c++文件前面加上这行extern"C"intPOM_AM__set_application_bypass(logicalbypa......
  • C++工厂模式简易实现
    C++工厂模式简易实现引言:动态绑定是面向对象编程的重要功能,但C++目前还没有纳入标准库的反射机制,所以为了更方便的动态构造对象,使得通过配置文件的方式改变派生类对象,而不需要去修改代码,所以可以使用工厂这一常见的设计模式,来完成类对象的动态构造。基于C++11的新特性和模板,实现......
  • 数据结构-算法-01-算法初步
     ......
  • 树上数据结构
    树上问题树链剖分学习笔记重链剖分对树进行重链优先搜索,暴力求一条路径的复杂度为logn模板voidtree_build(intu,intfa){//重链优先搜索 siz[u]=1; f[u]=fa; hson[u]=0; for(auto&v:adj[u]){deep[v]=deep[u]+1; if(v==fa)continue; tree_build(v,u);......
  • 【数据结构 | 入门】堆栈与队列(问题引入&实现&算法优化)
    ......
  • 【转载】C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
    【结论】一、在有些情况下,必须使用初始化列表。特别是const和引用数据成员被初始化时。二、从效率方面来说,对于内置类型或复合类型,差异不会太大,但对于非内置数据类型,差异还是很明显的【具体参考】C/C++通过初始化列表和构造函数内赋值初始化成员变量的区别_Zju_Jemery的博客-......
  • 数据结构(二)
    目录4.树4.1树和二叉树4.2二叉树4.2.1顺序结构4.2.2链式结构4.2.3二叉树的遍历4.2.4二叉排序树4.2.5平衡二叉树4.5.6哈夫曼树4.3非二叉树和森林5.图5.1图的存储结构5.1.1数组表示法5.1.2邻接表5.2图的遍历5.2.1深度优先搜索(DFS:DepthFirstSearch)5.2.2广度优先搜索(BFS:Breadt......
  • 《C++》机房预约系统案例
    机房预约系统文件可运行存在bug,断断续续手搓10多天Administrator.h#pragmaonce#include"LoginIdentity.h"#include"CompRoom.h"classMapId{public: stringM_name; stringM_pwd;};classLoginAdmin:publicLogin{public: LoginAdmin(); LoginAdmin(stri......
  • C++ 核心指南之 C++ 哲学/基本理念(下)
    C++核心指南(C++CoreGuidelines)是由BjarneStroustrup、HerbSutter等顶尖C+专家创建的一份C++指南、规则及最佳实践。旨在帮助大家正确、高效地使用“现代C++”。这份指南侧重于接口、资源管理、内存管理、并发等High-level主题。遵循这些规则可以最大程度地保证静......
  • 数据结构学习3
    树型结构:1、树的基本概念:一种表示层次关系(一对多)的数据结构有且仅有一个特定节点,该节点没有前趋节点,称为这棵树的根节点剩余有n个(n>=0)有限个多节点组成互不相交的子集,每个子集都可以是一棵树,都被称为根节点的子树注意:树中有树,树型结构具有递归性2、树的表示方式:倒悬树、凹......