c++递归实现n皇后问题代码(八皇后问题)

yizhihongxing

实现n皇后问题的代码可以用递归的方法来实现。这里提供一份c++递归实现n皇后问题代码以及完整攻略。

思路简述

n皇后问题指的是在一个nxn的棋盘上放置n个皇后,使得皇后之间互不攻击,即任意两个皇后都不能放置在同一行、同一列或同一对角线上。这里我们可以使用递归的方法来实现。

具体实现思路如下:

  1. 首先定义一个长度为n的一维数组board,用来存放每一行中皇后所在的列号。比如board[2]表示第3行中皇后所在的列号。
  2. 然后对于每一行,依次尝试将皇后放置在每一列中,然后判断当前格子是否安全。
  3. 如果安全,就在该位置放置皇后,并递归处理下一行。
  4. 如果下一行无法放置,就回溯到上一行,将皇后前一次放置的位置换成不同的列进行尝试。

代码示例

下面给出一份c++递归实现n皇后问题的代码。

#include <iostream>
#include <vector>

using std::vector;
using std::cout;
using std::endl;

bool is_valid(vector<int>& board, int row, int col)
{
    for (int i = 0; i < row; ++i) 
    {
        int val = board[i];
        if (val == col || val + row - i == col || val - row + i == col)
            return false;
    }
    return true;
}

void solve_n_queen(vector<vector<string>>& res, vector<int>& board, int row)
{
    int n = board.size();
    if (row == n) 
    {
        vector<string> solution(n, string(n, '.'));
        for (int i = 0; i < n; ++i) 
        {
            solution[i][board[i]] = 'Q';
        }
        res.push_back(solution);
        return;
    }

    for (int col = 0; col < n; ++col) 
    {
        if (is_valid(board, row, col)) 
        {
            board[row] = col;
            solve_n_queen(res, board, row + 1);
            board[row] = -1;
        }
    }
}

vector<vector<string>> solveNQueens(int n) 
{
    // 初始化一维数组board,并全部置为-1
    vector<int> board(n, -1);
    vector<vector<string>> res;
    solve_n_queen(res, board, 0);
    return res;
}

int main()
{
    vector<vector<string>> res = solveNQueens(8);
    for (int i = 0; i < res.size(); ++i) 
    {
        cout << "Solution " << i + 1 << ":" << endl;
        for (int j = 0; j < res[i].size(); ++j) 
        {
            cout << res[i][j] << endl;
        }
        cout << endl;
    }
    return 0;
}

这份代码可以输出8皇后问题的所有解,通过改变solveNQueens函数中的参数n,可以输出n皇后问题的所有解。

示例说明

下面给出两个代码示例来说明该代码的运行结果。

示例1: 输入参数为4,该代码将输出4皇后问题的所有解。

Solution 1:
.Q..
...Q
Q...
..Q.

Solution 2:
..Q.
Q...
...Q
.Q..

示例2: 输入参数为8,该代码将输出8皇后问题的所有解,由于这里的解非常多,我们只显示其中的3个。

Solution 1:
Q.......
....Q...
.......Q
..Q.....
......Q.
.Q......
.....Q..
...Q....

Solution 2:
Q.......
.....Q..
.......Q
..Q.....
......Q.
.Q......
...Q....
....Q...

Solution 3:
.Q......
...Q....
.....Q..
.......Q
Q.......
......Q.
..Q.....
....Q...

以上就是c++递归实现n皇后问题的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++递归实现n皇后问题代码(八皇后问题) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 魔兽世界TBC怀旧服防骑自动档保命宏 一键保命宏命令分享

    魔兽世界TBC怀旧服防骑自动档保命宏攻略 什么是防骑自动档保命宏? 在魔兽世界TBC怀旧服中,防骑是一个非常重要的职业,需要在战斗中不断释放技能来保持生命值。但是在紧急情况下,我们可能会因为紧张忘记释放某个技能,导致死亡。这时,我们可以通过编写自动档保命宏,在危急时刻一键触发来保护自己的生命值。 如何编写一键保命宏? 我们可以使用宏命令来编写一键保命宏,以下…

    other 2023年6月26日
    00
  • 简易jquery插件

    当然,我可以为您提供详细的“简易jQuery插件”的完整攻略,包括两个示例说明。 简易jQuery插件的完整攻略 jQuery是一个流行的JavaScript库,它提供了许多实用的功能和方法,可以简化JavaScript编程。jQuery插件是一种扩展jQuery功能方式,可以我们轻松地添加自定义功能和效果。在本教程中,我们将介绍如何编写一个简易的jQuer…

    other 2023年5月7日
    00
  • MySQL数据库输入密码后闪退问题的解决方法

    下面就是详细讲解MySQL数据库输入密码后闪退的解决方法完整攻略: 问题背景 MySQL是一种开源数据库,常用于Web应用程序的后台支持。在使用MySQL时,经常会遇到以下问题:输入密码后闪退。 解决方法 MySQL输入密码后闪退问题通常是由于MySQL配置文件中的一些错误或问题导致的。可以通过以下步骤解决这个问题: 步骤1:检查MySQL配置文件 首先,打…

    other 2023年6月26日
    00
  • matlabr2016b安装教程

    Matlab R2016b安装教程的完整攻略 本文将提供一份关于Matlab R2016b安装教程的完整攻略,包括下载、安装、激活以及注意事项。 下载 先需要从MathWorks官网下载Matlab R2016b安装文件。可以通过以下步骤进行下载: 访问MathWorks官网:https://www.mathworks/ 点击“Downloads”按钮,进入…

    other 2023年5月9日
    00
  • 深入学习Spring Boot排查 @Transactional 引起的 NullPointerException问题

    深入学习Spring Boot排查 @Transactional 引起的 NullPointerException 问题 问题描述 在使用 Spring Boot 进行开发时,经常会用到 @Transactional 注解来管理事务。然而,有时候在使用 @Transactional 注解的过程中,可能会遇到 NullPointerException(空指针异…

    other 2023年6月28日
    00
  • 23种设计模式(1) java单例模式

    下面是“23种设计模式(1) java单例模式”的完整攻略: 什么是单例模式 单例模式指的是某个类只能实例化一个对象,无论在何时何地,都只会存在一个对象。 单例模式的优缺点 优点 避免了频繁创建和销毁对象所带来的性能开销,特别是对于一些重量级的对象,这样的性能开销更加明显。 节省了系统的资源,因为这种情况下,对象的实例只有一个,不会浪费内存资源。 可以保证对…

    other 2023年6月27日
    00
  • Angular.js之作用域scope’@’,’=’,’&’实例详解

    Angular.js之作用域(scope) ‘@’, ‘=’, ‘&’ 实例详解 Angular.js是一个流行的JavaScript框架,它使用了一种称为作用域(scope)的概念来管理数据和事件。作用域(scope)是一个对象,它将控制器(controller)和视图(view)连接起来,使它们能够相互通信。 在Angular.js中,作用域(s…

    other 2023年8月19日
    00
  • delphi2010安装及调试

    以下是“Delphi2010安装及调试”的完整攻略: Delphi2010安装及调试 Delphi是一款流行的集成开发环境(IDE),用于开发Windows应用程序。在本攻略中,我们将介绍如何安装Delphi2010,并进行调试。 步骤1:下载Delphi2010安装程序 在开始安装Delphi2010之前,您需要下载Delphi2010安装程序。您可以Em…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部