n皇后问题

题目链接:https://www.acwing.com/problem/content/845/

  1. 枚举每一行,判断列,对角线是否满足条件
#include<iostream>
#include<cstdio>
using namespace std; 
const int N=20;
char g[N][N];
bool st[N], dg[2*N], udg[2*N];
int 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(!st[i]&&!dg[u+i]&&!udg[u-i+n]){
			st[i]=dg[u+i]=udg[u-i+n]=1;
			g[u][i]='Q';
			dfs(u+1);  //当这一行出现了满足条件的放法,才会往下行搜索
			st[i]=dg[u+i]=udg[u-i+n]=0;
			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;
}
  1. 枚举每个格子,有放与不放两种选择,在符合条件的位置上选择放置,这个需要要判断最后放置的个数到不到n个
#include<iostream>
#include<cstdio>
using namespace std; 
const int N=20;
char g[N][N];
bool col[N],row[N],eg[2*N], ueg[2*N];
int n;
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;i++) puts(g[i]);
			puts("");
		}
		return ;				
	}
	
	//不放
	dfs(x,y+1,s);
	//放
	if(!col[y]&&!row[x]&&!eg[x+y]&&!ueg[x-y+n]){  
		g[x][y]='Q';
		col[y]=row[x]=eg[x+y]=ueg[x-y+n]=1;
		dfs(x,y+1,s+1);
		g[x][y]='.';
		col[y]=row[x]=eg[x+y]=ueg[x-y+n]=0;
	} 
}
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值