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

实现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日

相关文章

  • Android快速实现无预览拍照功能

    Android快速实现无预览拍照功能攻略 在Android应用中实现无预览拍照功能可以通过使用Camera2 API来实现。下面是一个详细的攻略,包含了两个示例说明。 步骤1:添加权限和依赖项 首先,在你的Android项目的AndroidManifest.xml文件中添加以下权限: <uses-permission android:name=\&qu…

    other 2023年8月23日
    00
  • ZooKeeper入门教程一简介与核心概念

    ZooKeeper入门教程一:简介与核心概念 简介 ZooKeeper是一个分布式的解决方案,它可以用来管理和协调分布式应用程序。ZooKeeper可以用于实现诸如分布式锁、服务发现和集群管理等功能。ZooKeeper的设计目标是提供一个高性能、高可靠性、具备严格顺序性、支持分布式部署的专用协调服务。 核心概念 ZNode ZNode是ZooKeeper的数…

    other 2023年6月27日
    00
  • Spring初始化和销毁的实现方法

    下面是关于 Spring 初始化和销毁的实现方法的详细攻略。 什么是Spring Bean的初始化和销毁 Spring Framework中的Bean对象可以有生命周期,即它们可以被创建、初始化、使用和销毁。在Spring容器中,Bean初始化和销毁时可以自动触发某些动作。 在Java中,Bean的实例化,通过构造函数或者静态工厂方法完成,而数据注入则是通过…

    other 2023年6月20日
    00
  • android之build.prop属性详解

    以下是Android之build.prop属性详解的攻略,包含两个示例: 什么是build.prop文件? build.prop文件是Android系统中的一个重要配置文件,它包含了许多系统属性和配置信息。这些属性和配置信息可以影响系统的行为和性能,因此在进行优化和定制时,修改build.prop文件是一个常见的操作。 如何修改build.prop文件? 要…

    other 2023年5月6日
    00
  • 一文理解Python命名机制

    一文理解Python命名机制 Python是一种高级编程语言,具有灵活的命名机制。理解Python的命名机制对于编写清晰、可维护的代码至关重要。本文将详细介绍Python的命名机制,并提供两个示例来说明其工作原理。 1. 命名规则 Python的命名规则如下: 变量名必须以字母或下划线开头,后面可以跟字母、数字或下划线。 变量名区分大小写,例如myVaria…

    other 2023年8月15日
    00
  • sourceTree初识

    下面是关于SourceTree初识的完整攻略,包括介绍、步骤和两个示例说明。 介绍 SourceTree是一款免费的Git和Mercurial版本控制工具,可以帮助开发者更方便地管理和协作代码。本文将介绍如何使用SourceTree进行版本控制和协作开发。 步骤 使用SourceTree进行版本控制和协作开发的步骤通常包括以下几个步骤: 下载和安装Sourc…

    other 2023年5月6日
    00
  • SpringBoot Admin健康检查功能的实现

    针对“SpringBoot Admin健康检查功能的实现”的完整攻略,我来详细讲解下。 1. SpringBoot Admin SpringBoot Admin是一个管理和监控SpringBoot应用的开源框架,它提供了用户友好的Web UI界面来查看和管理SpringBoot应用程序。它还提供了实时监视和通知等功能,并支持JMX-over-WebSocke…

    other 2023年6月27日
    00
  • RabbitMQ在特来电的深度应用

    RabbitMQ在特来电的深度应用的完整攻略 本文将为您提供RabbitMQ在特来电的深度应用的完整攻略,包括介绍、使用方法和两个示例说明。 介绍 RabbitMQ是一款开源的消息队列软件,可以用于实现分布式系统中的消息传递和异步处理。特来电是一家提供新能源汽车充电服务的公司,使用RabbitMQ实现了充电桩和后台系统之间的消息传递和异步处理。本文将介绍Ra…

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