提示:入门问题
文章目录
前言
小龙🐉看了acwing图论一章,发现n皇后问题在[”蓝桥杯“练习系统](http://lx.lanqiao.cn/)出现过,又把它拿出来看了看。
一、问题描述
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。
输入格式
输入中有一个正整数N≤10,表示棋盘和皇后的数量
输出格式
为一个正整数,表示对应输入行的皇后的不同放置数量。
样例输入
5
样例输出
10
数据规模和约定
N≤10
二、提交代码
代码如下(示例):
#include<iostream>
using namespace std;
const int N=20;
int n,ret;
char g[N][N];
bool col[N],dg[N],udg[N];
void dfs(int u)
{
if(u==n){
ret++;
return ;
}
for(int i=0;i<n;i++)
if(!col[i]&&!dg[u+i]&&!udg[n-u+i])
{
col[i]=dg[u+i]=udg[n-u+i]=true;
dfs(u+1);
col[i]=dg[u+i]=udg[n-u+i]=false;
}
}
int main()
{
cin>>n;
dfs(0);
cout<<ret;
return 0;
}
2.查看样例
该处使用的vip的数据。
intputs outputs
0 0
4 2
5 10
8 92
10 724
2 0
3 0
6 4
7 40
9 352
总结
提示:这里对文章进行总结:
n皇后问题是简单的dfs问题,深度优先搜索模板不固定,需要灵活运用
输出棋盘的模板
#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);
}