n皇后问题 C++

article/2025/10/6 0:58:25

先上代码!

#include<iostream>
using namespace std;const int N = 20;int n;
bool row[N],col[N], dg[N], udg[N];
char g[N][N];void dfs(int x, int y, int z)
{if (y == n) y = 0, x++; //判断y是否已经抵达边界,抵达后,x+1进行下一行if (x == n){if (z == n) //皇后放完{for (int i = 0; i < n; i++)puts(g[i]); //输出棋盘cout << "\n";}return;}//放皇后if(!row[x] && !col[y] && !dg[x + y] && !udg[x - y + n])//x轴,y轴,斜着的两条线都没有皇后时{g[x][y] = 'Q'; //放一个皇后row[x] = col[y] = dg[x + y] = udg[x - y + n] = true; //此时这些线被占住了dfs(x+1, 0, z + 1);//继续这个流程,x+1直接换行,从y = 0开始,z+1下一个皇后row[x] = col[y] = dg[x + y] = udg[x - y + n] = false;//这叫回溯g[x][y] = '.'; //这叫回溯}//不放皇后, z不加1;y+1来像后面退格dfs(x, y + 1, z);}int main()
{cin >> n;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){g[i][j] = '.'; //造棋盘嗷}}dfs(0, 0, 0);return 0;
}

运算结果:

4
.Q..
...Q
Q...
..Q...Q.
Q...
...Q
.Q..
5
Q....
..Q..
....Q
.Q...
...Q.Q....
...Q.
.Q...
....Q
..Q...Q...
...Q.
Q....
..Q..
....Q.Q...
....Q
..Q..
Q....
...Q...Q..
Q....
...Q.
.Q...
....Q..Q..
....Q
.Q...
...Q.
Q.......Q.
Q....
..Q..
....Q
.Q......Q.
.Q...
....Q
..Q..
Q........Q
.Q...
...Q.
Q....
..Q......Q
..Q..
Q....
...Q.
.Q...

是的,代码贼短,这个用到了深搜算法,DFS;理解了其实很简单;注释在代码里面有,主要讲一下回溯和剪枝,如图:

 这道题就是问1 2 3所有排序;画图就是先在第一个位置填1,再在第二位置,第三个位置以次填2,3;然后你发现没数字可以填了,就可以回去一次1 2 3 - > 1 2 _,然后发现还是只能填3,就在回去一次 1 2 _ -> 1 _ _,然后可以填3;这就是回溯,这个代码我也整出来吧,可以和八皇后一起看一下:

#include<iostream>using namespace std;const int N = 10;bool st[N]; //这个数有没有用过
int n;
int path[N];void dfs(int u)
{if (u == n){for (int i = 0; i < n; i++) cout << path[i] << " ";cout << "\n";return;}for (int i = 1; i <= n; i++){if (!st[i]){path[u] = i;st[i] = true;dfs(u + 1);st[i] = false;}}
}int main()
{cin >> n;dfs(0);return 0;
}

完毕,不懂就多看看……

算了,再给你们整个图,方便你们理解,文字描述就不写了,就是不断回溯的流程:

 return后Q -> .,并往后退判断成不成立,不成立就继续回溯,然后直接回溯到第一行,第一行终于成立了,然后就继续了。(  !保姆级教程!)

这下真的完了


http://chatgpt.dhexx.cn/article/5yMtGUpK.shtml

相关文章

回溯法-N皇后问题

一、N皇后问题 n皇后问题&#xff1a;要求在一个nn的棋盘上放置n个皇后&#xff0c;使得任意两个皇后不在同一行或同一列或同一斜线上。 二、回溯法 回溯法是一类非常重要的算法设计方法&#xff0c;有“通用解题法”之称。 回溯法&#xff08;探索与回溯法&#xff09;&am…

(新手向)N皇后问题详解(DFS算法)

非常经典的一道题&#xff1a; N皇后问题&#xff1a; 国际象棋中皇后的势力范围覆盖其所在的行、列以及两条对角线&#xff0c;现在考察如下问题&#xff1a;如何在n x n的棋盘上放置n个皇后&#xff0c;使得她们彼此互不攻击 。 免去麻烦我们这里假定n不是很大。。 &#…

n皇后问题-c语言实现

n皇后问题描述为:在一个nxn的棋盘上摆放n个皇后&#xff0c;要求任意两个皇后不能冲突&#xff0c;即任意两个皇后不在同一行、同一列或者同一斜线上。 1,1 1,2 1,3 1,4 2,1 2,2 2,3 2,4 3,1 3,2 3,3 3,4 4,1 4,2 4,3 4,4 上面是4皇后摆放方案&#xff0c;只有…

n皇后问题合集

八皇后问题是dfs的经典问题&#xff0c;目前遇到过的类型大致有这么几种&#xff1a; 1.经典n皇后问题 题目描述 n−皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 …

N皇后问题(c语言实现)

问题描述&#xff1a; 有一个n*n的棋盘&#xff0c;在这个棋盘中放n个皇后&#xff0c;使得这n个皇后&#xff0c;任意两个皇后不在同一行&#xff0c;同一列&#xff0c;同一条对角线。例如&#xff0c;当n等于4时&#xff0c;有两种摆法。 输入只有一个整数n。 思路 如果…

N皇后问题

问题描述 n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题的一种解法。 给定一个整数 n&#xff0c;返回所有不同的 n 皇后问题的解决方案。 每一种解法包含一个明确的 n 皇后问题的棋子放置方案&#…

回溯算法之N皇后问题

问题描述 什么是皇后问题(有一定了解可以直接跳过这个部分看求解部分哦) 八皇后问题&#xff08;英文&#xff1a;Eight queens&#xff09;&#xff0c;是由国际西洋棋棋手马克斯贝瑟尔于1848年提出的问题&#xff0c;是回溯算法的典型案例。 问题表述为&#xff1a;在88格的…

N皇后问题(分支限界法)

问题描述&#xff1a; 在 n * n 格的棋盘上放置彼此不受攻击的 n 个皇后。按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题等价于在 n * n 的棋盘上放置 n 个皇后&#xff0c;任何 2个皇后不放在同一行或同一列或同一斜线上…

N皇后问题详解

文章目录 一、题目描述二、题目解析&#xff08;1&#xff09;思考一(集合回溯)&#xff08;2&#xff09;思考二(数组深度递归)&#xff08;3&#xff09;思考三(位运算) 一、题目描述 N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后&#xff0c; 要求&#xff1a;任何两个皇…

3.2 回溯法—N皇后问题

1. 问题描述 在 n n n\times n nn的棋盘上摆放 n n n个皇后&#xff0c;使任意两个皇后都不能处于同一行、同一列或同一斜线上 2. 问题分析 下以求解4皇后问题为例&#xff0c;分析4皇后问题的排列树以及回溯过程&#xff1a; 搜索及回溯过程&#xff1a; 解空间树&#…

【经典算法】N皇后问题

✨前言✨ N皇后问题经典的解决方案是暴力递归&#xff0c;其时间复杂度是O(2^n),因此常用来测试计算机的算力。今天我会给大家带来经典方法的详解&#xff0c;也会给大家展示N皇后优化后的大神解法。做一道经典题目&#xff0c;来一场思维旅行。 目录 ✨前言✨ &#x1f4a1;…

n皇后问题(回溯法)(超易理解)(详细注释)

问题&#xff1a; N皇后问题是一个经典的问题&#xff0c;描述如下&#xff1a; 在的方格棋盘需要放置N个皇后&#xff0c;使得它们不相互攻击&#xff0c; 即任意2个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成45度角的斜线上。 对于给定的N…

n皇后问题(回溯法)

目录 1.问题描述 2.问题分析 3.完整源码 1.问题描述 八皇后问题是十九世纪著名的数学家高斯于1850年提出的。问题是:在88的棋盘上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。可以把八皇后问题扩展到n皇后问…

【浏览器跨域】跨域访问接口浏览器怎么设置?

window系统 1、右键浏览器&#xff0c;点击属性 2、找到目标&#xff0c;目标输入框内容最后面加上 --disable-web-security --user-data-dirC:\MyChromeDevUserData&#xff0c;–user-data-dir 3、点击确定 4、重新打开浏览器即可 mac系统 终端输入&#xff0c;重新打开浏…

AJAX跨域访问(不同域之间相互访问)

目录 一、跨域&#xff1a;二、同源策略&#xff1a;三、解决Ajax跨域问题的方案&#xff1a;方案一&#xff1a;设置响应头方案二&#xff1a;jsonp方案三&#xff1a;jQuery封装jsonp方案四&#xff1a;代理机制&#xff08;httpclient&#xff09;方案五&#xff1a;nginx反…

nginx配置图片跨域访问

在server段中添加红框内的图片跨域内容 参数 location ~* .*.(gif|jpg|jpeg|png|bmp|swf)$ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS…

浏览器跨域访问限制

一.什么是跨域 广义的跨域&#xff1a; (1) 资源跳转&#xff1a;A链接、重定向、表单提交 (2) 资源嵌入&#xff1a;<link>、<script>、<img>、<frame>等dom标签&#xff0c;还有样式中background:url()、font-face()等文件外链 (3) 脚本请求&#x…

Django 多方式实现跨域访问

一、什么是跨域 1.1 跨越介绍 跨域&#xff0c;是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript实施的安全限制。 这里说明一下&#xff0c;无法跨域是浏览器对于用户安全的考虑&#xff0c;如果自己写个没有同源策略的浏览…

Flask中跨域访问的实现

在我们访问不同的服务器时&#xff0c;就会涉及到了跨域的问题。因为不同域名之间是无法进行交流的&#xff0c;然后跨域就打破了这种规则的限制。说起Flask中的跨域&#xff0c;就不得不提到CORS组件了&#xff0c;相信大家在其它框架中也见过了它的身影。下面我们就跨域问题和…

Tomcat设置允许跨域访问

开发React项目时前端通过axios向后端代码发起请求调试的时候由于后端代码运行在8080端口而React项目运行在3000端口导致浏览器的同源策略禁止跨域请求&#xff0c;因此需修改Tomcat配置文件web.xml以开放跨域访问。 在tomcat的web.xml文件末尾加上&#xff1a; <filter>…