n queens ii(n皇后问题-只计数不保存)

问题描述

The n queens puzzle is the problem of placing n queens on an N x Nchessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens’ placement, where’Q’and’.'both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:

题目大意

著名n皇后问题。
n个皇后摆放在N x N的棋盘格中,使得横、竖和两个对角线方向均不会同时出现两个皇后。

解题思路

n皇后问题当n大于等于4才有讨论意义,而且不只有一个解决方案;
递归的方法找到每一种解决方案;
在当前解决方案中,遍历每一行的每一列查找可以放置皇后的位置
在当前行中,遍历每一列的每一个位置,假设当前位置可以放,然后进行合法性判断,合法则放置;
然后再递归判断下一行;
递归结束后,将当前行当前列的位置回溯,置为未放状态,再接着判断当前行下一列,目的是为了找到所有的解决方案。

代码

#include<iostream>
#include<vector>
using namespace std;/*函数声明
*/
// 解决方案函数
vector<vector<string > > solveNQueens(int n);
// 用深度优先搜索的递归实现进行查找解决方案
void dfs(vector<vector<string > > &res, vector<string > &cur, int &n, int row);
// 判断是否可以在当前的row行col列进行放置的合法性
bool isValid(vector<string> &cur, int &n, int row, int col);vector<vector<string > > solveNQueens(int n) {// 解决方案结果集vector<vector<string > > res;// 初始化棋盘,所有的位置都没有摆放皇后vector<string> cur(n, string(n, '.'));dfs(res, cur, n, 0);return res;
}/*res:返回的解决方案集cur:当前的一个解决方案n:n皇后问题row:当前解决方案的第row行
*/
void dfs(vector<vector<string > > &res, vector<string> &cur, int &n, int row) {// 当超出行数超出了棋盘,则把这次搜索的结果放入res中。if (row == n) {res.push_back(cur);return;}for (int j = 0; j < n; j++) {// 判断在row行j列处是否可以放一个皇后if (isValid(cur, n, row, j)) {// 如果可以,则放一个皇后在(row,j)cur[row][j] = 'Q';// 继续在下一行找一个位置放皇后dfs(res, cur, n, row + 1);// 因为需要找到所有可能的情况,所以必然需要对每一行进行回退。// 去判断这一行的下一列是否可以放皇后。cur[row][j] = '.';}}
}
/*cur:当前解决方案n:n皇后问题row:考虑当前解决方案的第row行col:考虑当前解决方案的第col行
*/
bool isValid(vector<string> &cur, int &n, int row, int col) {// 检查列for (int i = 0; i < row; i++) {if (cur[i][col] == 'Q') {return false;}}// 检查反斜线(\)for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {if (cur[i][j] == 'Q') {return false;}}// 检查斜线(/)for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {if (cur[i][j] == 'Q') {return false;}}return true;
}
int main()
{vector<vector<string > > res = solveNQueens(4);for(int i=0; i<res.size(); i++){for(int j=0; j<res[0].size(); j++)cout<<res[i][j]<<endl;cout<<endl;}return 0;
}

运行结果

以上。

n-queens(n皇后问题)相关推荐

  1. Eight Queens(八皇后)

    八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例. 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个 ...

  2. 1222 可以攻击国王的皇后

    题目描述: 在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」. 「黑皇后」在棋盘上的位置分布用整数坐标数组 queens 表示,「白国王」的坐标用数组 king 表示. 「黑皇后」的行棋 ...

  3. python DFS深度优先搜索及N皇后问题求解

    DFS可谓是算法里的一个大头,不懂DFS都不敢承认自己学过数据结构.今天菜鸡我要逆袭了,先从经典的N皇后问题搞起,试试DFS水深几尺[略加思索] 内容篇幅有点长,不想看我对DFS嗷嗷叫的朋友还是直接去 ...

  4. 八皇后问题 matlab,Matlab 递归求解八皇后问题

    这是递归版本,随后会给出其他版本 function Queens % 8皇后问题的递归法求解 sol = 1; % 解的个数 queen = zeros(8); % 8*8的棋盘 saferows = ...

  5. 八皇后算法分析及源代码

    [问题描述]  八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九 世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使 其不能互相攻击,即任意两个皇后都不能处 ...

  6. c语言中堆栈_C语言编程中的堆栈

    c语言中堆栈 A stack is a linear data structure, collection of items of the same type. 堆栈是线性数据结构 ,是相同类型的项目 ...

  7. 堆栈计算机的原理和实现

    堆栈计算机的原理和实现 原书< Stack Computers: the new wave > (原书封面) 原作者 Philip J. Koopman, Jr. 编译者 赵宇 张文翠 这 ...

  8. C和C++算法完整教程专栏完整目录

    C和C++算法完整教程专栏完整目录 专栏说明如下 完整专栏目录如下 专栏说明如下 内容:C和C++算法完整教程 数量:680篇博文(2023年2月15日截止) 更新时间至:2023年2月15日(后续加 ...

  9. NCURSES库简介

    5月16日 第一章 NCURSES库简介 在使用电传终端作为计算机输出设备的那个年代,电传终端是和计算机分开放置的,并通过串行电缆连接.终端的配置通过发送一系列字节完成.所有的终端控制操 作:改变光标 ...

  10. 算法(Python版)|156Kstars|神级项目-(1)The Algorithms - Python简介

    文章目录 算法(Python版) 项目地址 项目概况 说明 参与入门 社区频道 算法列表 Arithmetic Analysis 算术分析 Audio Filters 音频过滤器 Backtracki ...

最新文章

  1. React React-Redux的安装,使用
  2. 带你和Python与R一起玩转数据科学: 探索性数据分析(附代码)
  3. C++中const用法总结
  4. jQuery中focusin()和focus()、find()和children()的差别
  5. Mybatis的selectKey使用
  6. 【实操】配置Telnet与SSH
  7. Java jdbc连接数据库 INSERT插入
  8. shell之常用脚本
  9. 茴香豆的n种写法之②——Sql据多个条件 查询每个条件的前N条记录
  10. 双目立体视觉匹配算法-----SAD匹配算法、BM算法、SGBM算法、GC算法
  11. 【leetcode】二叉树(python)
  12. android alertdialog 自定义时间,Android自定义dialog可选择展示年月日时间选择栏
  13. ubuntu16.04安装red5
  14. matlab用劳斯判据求k的范围,「精」已知单位负反馈系统的开环传递函数为G=K/s试确定系统稳定时的K值范围...
  15. Python菜鸟入门: 如何在Python中读写文件
  16. F检验 matlab
  17. 小球弹跳及MATLAB实现
  18. tensorflow2没有slim模块
  19. win32Day06:控件
  20. proxmox ve 中文社区_Proxmox VE 部署维护

热门文章

  1. 在Ubuntu上为软件安装桌面快捷方式
  2. 进军高级测试这几条建议,让你在自动化界占据一个角落......
  3. 解锁三星bl锁有几种方法_三星手机通用解锁教程 官方解锁Bootloader教程
  4. 51、基于51单片机的GPS定位系统(GSM短信)
  5. 判别两棵树是否相等 设计算法_BAIR最新RL算法超越谷歌Dreamer,性能提升2.8倍
  6. css transition left 不起作用
  7. 湖南农业大学计算机专业考研大纲,湖南农业大学842信息化概论2020年考研专业课初试大纲...
  8. 在自己的软件中使用鼠标
  9. Python:爬取上市公司公告-Wind-CSMAR
  10. Maven >3.2