首页 > 编程语言 >N皇后问题(C++)

N皇后问题(C++)

时间:2024-07-11 13:57:45浏览次数:15  
标签:cur int C++ 问题 算法 放置 对角线 皇后

问题描述

N皇后问题是一个经典的计算机科学问题,要求在一个N×N的棋盘上放置N个皇后,使得彼此不互相攻击。攻击的定义包括皇后在同一行、同一列或同一对角线上。

规则
  1. 任意两个皇后不能在同一行。
  2. 任意两个皇后不能在同一列。
  3. 任意两个皇后不能在同一条斜线上(包括主对角线和副对角线)。
解决方法:回溯算法

回溯算法是解决N皇后问题的主要方法之一,其基本思想是逐行放置皇后,并使用递归来试探每一种可能的布局方式,同时在不符合规则的情况下进行回溯。

算法步骤:
  • 使用一个数组 cols,其中 cols[row] 表示第 row 行皇后所在的列数。
  • 从第一行开始逐行放置皇后。
  • 每次放置皇后时,检查是否与之前的皇后冲突(同列或对角线),如果不冲突则继续放置下一行的皇后。
  • 如果当前行无法找到合适位置,则回溯到上一行,重新放置皇后。
计算解的数量

N皇后问题的解的数量可以用公式 ( f(N) ) 表示,其中 ( f(N) ) 是N×N棋盘上放置N个皇后的所有可能布局的数量。具体的计算方式和公式依赖于具体的N值,例如对于N=8,解的数量为92种。

算法优化与注意事项

除了基本的回溯算法,可以通过剪枝等技术来优化算法效率,特别是在处理大规模N皇后问题时。解的对称性和唯一性也是需要考虑的因素,通常计算解的总数时会考虑所有可能的对称形式。
 

#include <vector>
#include <iostream>
using namespace std;

// 检查在当前布局 'cur' 下,将皇后放置在列 x 是否有效
bool avaliable(int x, vector<int> cur);

// 全局变量
int L = 8;        // 棋盘大小 (8x8)
int cnt = 0;      // 计数器,记录找到的解的数量

// 递归函数解决 N 皇后问题
void n_queen(int n, vector<int> cur)
{
    // 基本情况:如果 n 达到 0,则所有皇后已正确放置
    if (n == 0)
    {
        // 输出解决方案
        cout << endl;
        for (int i = 0; i < L; i++)
            cout << cur[i] << ",";
        cout << endl;
        for (int i = 0; i < L; i++)
        {
            for (int j = 0; j < L; j++)
            {
                if (cur[i] == j)
                {
                    cout << "Q";
                }
                else
                {
                    cout << "[]";
                }
            }
            cout << endl;
        }
        cnt++;
        return;
    }

    // 尝试放置皇后在每一列
    for (int i = 0; i < L; i++)
    {
        if (avaliable(i, cur))
        {
            cur.push_back(i); // 放置皇后
            n_queen(n - 1, cur); // 递归放置下一个皇后
            cur.pop_back(); // 回溯,尝试下一个列
        }
    }
}

// 检查在列 x 放置皇后是否有效
bool avaliable(int x, vector<int> cur)
{
    int s = cur.size();
    for (int i = 0; i < s; i++)
    {
        if (x == cur[i] || abs(s - i) == abs(x - cur[i]))
            return false; // 同一列或者对角线上有皇后
    }
    return true; // 有效
}

int main()
{
    vector<int> cur; // 当前放置皇后的列数数组
    n_queen(L, cur); // 解决 N 皇后问题
    cout << "一共有" << cnt << "个解" << endl; // 输出解的数量
}

标签:cur,int,C++,问题,算法,放置,对角线,皇后
From: https://blog.csdn.net/betty_19/article/details/140350138

相关文章

  • 解决方案 | IP地址申请专用HTTPS证书的常见问题
    IP地址专用的HTTPS证书是一种专门为IP地址设计的SSL/TLS证书,它可以通过HTTPS协议安全地访问基于IP地址实现的网站或服务,以下是申请IP地址https证书时经常遇到的问题以及解决办法。一、如何选择合适的IP地址https证书的类型?1、DV类型IP证书:DVIP地址证书是基础验证级别的证......
  • PTA 7-2 数组循环左移--C++
    本题思路:本题可以用数组或者指针来解决问题,本题我们如果我们用数组来解决问题的话,数组循环左移,就相当后面的数组右移过来,如i位置的就相当于i+m的位置的数组,大概这样的思路,就没有问题了#include<iostream>usingnamespacestd;intmain(){intn,m;cin>>n>>m;......
  • C++ 中的 lowbit
    lowbit的定义首先了解lowbit的定义\(lowbit(n)\),为\(n\)的二进制原码中最低的一位\(1\)以及其后面的\(0\)所表示的数举个简单的例子:将\(10\)使用二进制表示为\(1010\)其中最低位的\(1\)为第2位(\(_{10}1_0\),从右往左数)此时\(lowbit(10)\)使用二进制表示为......
  • 解决Github访问速度慢的问题(修改 HOSTS 文件)
    1.查询http://github.com的ip地址链接:http://github.global.ssl.fastly.net.ipaddress.com/#ipinfoIP:140.82.113.32.查询https://github.global.ssl.fastly.net的IP地址链接:https://github.com.ipaddress.com/#ipinfoIP:151.101.1.1943.修改本地hosts文件映......
  • BFS:边权相同的最短路问题
    一、边权相同最短路问题简介二、迷宫中离入口最近的出口.-力扣(LeetCode)classSolution{public:constintdx[4]={1,-1,0,0};constintdy[4]={0,0,1,-1};intnearestExit(vector<vector<char>>&maze,vector<int>&e){intm=maze.size(),n=......
  • QtQuick.Dialogs中的FileDialog设置默认目录的问题
    在QML中,假如想要使用文件浏览器选择文件或者文件夹时。可以使用FileDialog。FileDialog有个属性folder,设置好路径之后,当你打开fileDialog时,fileDialog当前定位到的路径就是你设置的路径。但是这个folder的设置有点问题,和路径的层级有关系假如你的目标路径是大于等于三级的(比如......
  • gitlab上传问题记录
    1.如果引用了子模块,关于上传子模块必须要有.gitmodule文件,所以先创建添加子模块gitsubmoduleadd<子模块仓库的URL><本地路径>初始化子模块:gitsubmoduleinit更新子模块:gitsubmoduleupdate或者你可以用一条命令完成初始化和更新:gitsubmoduleupdate--init如果......
  • 问题 E: 深入浅出学算法047-美元汇率
    5400300500300250样例输出 Copy266.67提示Day 1 ...changing 100.0000 美元= 400.0000 马克 Day 2 ...changing 400.0000 马克= 133.3333 美元 Day 3 ...changing 133.3333 美元= 666.6666 马克 Day 5 ...changing 666.6666 马克= ......
  • CentOS 乱码问题解决
    首先要区别3个概:编码集、字符集、字体是完全不同的东西,我们要解决的是字符集问题。当一个系统初始化完毕后,会生成一个/usr/lib/locale/locale-archive文件,这个是字符集二进制文件,是系统不同语言运行的核心,通过命令locale-a可以看到当前文件中支持的语言locale命令可以......
  • Docker 因端口映射不一致出现的问题
    问题描述因为服务器原先已经安装了nginx(非容器安装),并且占用80端口;而我方习惯使用容器进行安装应用,故用安装了一个容器ngixn;docker-compose.ymlversion:'3'services:nginx:restart:alwayscontainer_name:nginximage:nginxports:-81:80......