n-皇后问题(dfs,c++)

n-皇后问题是指将 n 个皇后放在 n×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上

n-皇后问题(dfs,c++)_第1张图片

现在给定整数 n,请你输出所有的满足条件的棋子摆法。

输入格式

共一行,包含整数 n。

输出格式

每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。

其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。

每个方案输出完成后,输出一个空行。

注意:行末不能有多余空格。

输出方案的顺序任意,只要不重复且没有遗漏即可。

数据范围

1≤n≤9

输入样例:

4

输出样例:silu

.Q..
...Q
Q...
..Q.

..Q.
Q...
...Q
.Q..

思路1: 先把所有的符号都写成‘.’,在每次递归时参数是行数,要求同一列和正对角线反对角线不能有皇后,开三个布尔数组,分别记录相应一列和相应正反对角线有没有被占到,如果没被占到,那就把那个空位输入Q。

还有一个特殊案例是1!当n=1时直接输出Q就可以啦

#include

using namespace std;
const int N=20;//要求10行但是对角线有10*2行
char g[N][N];//数组储存符号
int n;
bool col[N],dg[N],udg[N];//一个行,一个正对角,一个反对角,初始都是false,表示没有皇后
void dfs(int u){
	if(u==n){//当u=n时说明已经循环完毕
		for(int i=0;i

思路2:枚举每个位置上都有两种情况:放或者不放,每次递归参数是行数,列数和放的皇后数,不放的话直接递归到下一层,放的话要判断一下这一行这一列和这个位置的两个对角线有没有皇后,如果没有可以放。

#include
using namespace std;
int n,s;
bool row[10],col[10],ug[20],dug[20];//行数,列数,两个对角线
char g[10][10];//存图
void dfs(int x,int y,int s){
	if(y==n){//如果走到每行的最右边,走下一行的第一个
		y=0;
		x++;
	}
	if(x==n){//走到最后一行
		if(s==n){//如果皇后够了,输出
			for(int i=0;i>n;
	for(int i=0;i

注:思想来自acwing

你可能感兴趣的:(深度优先,c++,算法)