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布局优化之ViewStub控件

    当一个Activity包含大量的布局文件时,加载时间会变慢,影响用户体验。因此,Android中布局优化显得很有必要。ViewStub控件便是Android中一种有效的布局优化方式。 一、什么是ViewStub控件 在Android的布局文件中,可以使用ViewStub控件定义一个不可见的布局,这个布局不会在加载时被加载到内存中,只有在需要显示时才被实例化,…

    other 2023年6月27日
    00
  • gulp安装和使用简介

    以下是Gulp安装和使用简介的完整攻略,包括两个示例说明。 1. Gulp简介 Gulp是一个基于Node.js的自动化构建工具,可以帮助开发者自动化执行常见的开发任务,例如编译Sass、压缩JavaScript、优化图像等。Gulp使用简单、灵活,可以大大提高开发效率。 2. Gulp安装 以下是在Linux系统中安装Gulp的步骤: 安装Node.js:…

    other 2023年5月9日
    00
  • go语言beego框架web开发语法笔记示例

    Go语言Beego框架Web开发语法笔记示例攻略 简介 Beego是一个基于Go语言的开源Web应用框架,它提供了一系列的工具和库,用于快速开发高性能的Web应用程序。本攻略将详细讲解Beego框架的语法和使用方法,并提供两个示例说明。 安装Beego框架 首先,你需要安装Go语言和Beego框架。请按照以下步骤进行安装: 安装Go语言:根据你的操作系统,从…

    other 2023年8月6日
    00
  • svg 贝塞尔曲线图解(记录)

    SVG贝塞尔曲线图解(记录) 本文将为大家介绍SVG中贝塞尔曲线的基本概念、使用方法和实例演示。 什么是贝塞尔曲线? 贝塞尔曲线是数学曲线的一种,具有它自己的计算和画图方法。在图形学中,贝塞尔曲线的主要应用为生成和绘制复杂的曲线,如二次贝塞尔曲线、三次贝塞尔曲线等。 SVG中贝塞尔曲线的基本语法 <path d="M x1 y1 Q cx c…

    其他 2023年3月28日
    00
  • Mysql 忘记root密码的完美解决方法

    Mysql 忘记root密码的完美解决方法 如果您忘记了 Mysql 的 root 用户密码怎么办?本文将介绍一种解决方法。 方法 步骤一:停止 Mysql 服务 在开始重置密码之前,首先需要停止 Mysql 服务。可以输入以下命令以停止 Mysql 服务: sudo systemctl stop mysql 步骤二:编辑 Mysql 配置文件 编辑 Mys…

    other 2023年6月27日
    00
  • 详解Linux系统下PXE服务器的部署过程

    下面是详解Linux系统下PXE服务器的部署过程的完整攻略。 一、PXE服务器简介 PXE(Preboot eXecution Environment)是一种基于网络的远程启动技术,能够在网卡启动的基础上,通过网络启动计算机。PXE服务器就是支持PXE的服务器,主要功能是为客户端提供网络启动所需要的相关数据和服务。 二、PXE服务器的部署过程 1.安装DHC…

    other 2023年6月27日
    00
  • 探讨:将两个链表非降序合并为一个链表并依然有序的实现方法

    将两个非降序链表合并为一个链表并保持非降序的方法,可以采用以下步骤: 定义一个新链表,当前指针初始化为 NULL。 比较两个链表的头节点,将较小值的节点添加到新链表中,同时将这个链表的指针移动到下一个节点,然后比较两个链表当前节点的值,重复以上步骤,直到遍历完其中一个链表。 将另一个链表中剩余的节点加入新链表的尾部。 具体实现可以参考代码如下: struct…

    other 2023年6月27日
    00
  • nuxt.js服务端渲染中axios和proxy代理的配置操作

    当使用 Nuxt.js 进行服务端渲染时,我们可以通过配置 axios 库和代理(proxy)来优化 API 请求和应用性能。 配置 axios 库 首先,我们需要安装和编辑 nuxt.config.js 文件来配置 axios 库。安装 axios 库可以使用以下命令: bash npm install @nuxtjs/axios 接下来,我们需要在 nu…

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