n皇后问题

问题描述

n皇后问题


格式输入

n


格式输出

排列顺序


样例输入

4


样例输出

.Q…
…Q
Q…
…Q.

…Q.
Q…
…Q
.Q…


评测用例规模与约定

n<=10


解析

使用dfs算法进行解决,可以画一个递归搜索树来实现
解法一:枚举每一个
解法二:一行放一个
由y=x+b和y=-x+b实现


参考程序

#include<iostream>
using namespace std;
const int N=20;
char path[N][N];
bool row[N],col[N],udg[N],dg[N];
int n;
void dfs(int x,int y,int s)
{
    if(y==n){y=0;x++;}
    if(x==n)
    {
        if(s==n){
            REP(i,n)cout<<path[i]<<endl;
        }
        return;
    }
    if(!row[x]&&!col[y]&&!udg[x-y+n]&&!dg[x+y])
    {
        path[x][y] = 'Q';
        row[x]=col[y] =dg[x+y]=udg[x-y+n]= true;
        dfs(x,y+1,s+1);
        row[x]=col[y] =dg[x+y]=udg[x-y+n]= false;
        path[x][y] = '.';
    }
    dfs(x,y+1,s);
}
int main() {
    int t;
    cin >> t;
    while (t--) {
       cin>>n;
       REP(i,n)
       REP(j,n)
       path[i][j]='.';
       dfs(0,0,0);
    }
    return 0;
}
#include<iostream>
using namespace std;
const int N = 20;
int n;
char g[N][N];
bool col[N], dg[N], udg[N];
void dfs(int u)
{
	if (u == n)
	{
		for (int i = 0; i < n; i++)puts(g[i]);
		puts(" ");
		return;
	}//判定输出
	for (int i = 0; i < n; i++)
	{
		if (!col[i] && !dg[u + i] && !udg[n - u + i])
		{
			g[u][i] = 'Q';
			col[i] = dg[u + i] = udg[n - u + i] = true;//已经用了,决定列,对角线,反对角线
			dfs(u + 1);//递推
			col[i] = dg[u + i] = udg[n - u + i] = false;
			g[u][i] = '.';//还原
		}
	}
}int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			g[i][j] = '.';//初始化
	dfs(0);
	return 0;
}

以个人刷题整理为目的,如若侵权,请联系删除~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值