暴力搜索,每次搜索那一列是否可以摆放,
// luogu-judger-enable-o2
#include<stdio.h>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<math.h>
#include<algorithm>
using namespace std;
int n;
int pos[100];
int sum = 0;
void search(int k)
{
if(k == n)
{
sum++;
if(sum <= 3){
for(int i = 0; i < n; i++)
printf("%d ", pos[i] + 1);//从第零列开始放,所以结果加1才是所处的列
printf("\n");
}
return ;
}
for(int j = 0; j < n; j++)//尝试第k行皇后所有摆放的列
{
int i;
for( i = 0; i < k; i++)
{
if(pos[i] == j || (abs(k - i) == abs(j - pos[i])))//在列或者对角线冲突
break;
}
if(i == k)//没有冲突
{
pos[k] = j;
search(k + 1);
}
}
}
int main()
{
scanf("%d", &n);
search(0);
printf("%d\n", sum);
//system("pause");
}
2 优化,标记哪一列以及对角线被使用了。
// luogu-judger-enable-o2
#include<stdio.h>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<math.h>
#include<algorithm>
using namespace std;
int n;
int sum =0;
int col[100], l[100], r[100];
//col标记这一列是否被占用
//l是标记左上角对角线是否摆放有皇后
//r是标记右上角上角线是否摆放有皇后
int pos[100];//记录第I行皇后所处的位置
void dfs(int k)//从第k行开始摆
{
if(k == n)//0到n-1行摆好,即n个皇后已经摆好
{
sum++;
if(sum <= 3)
{
for(int i = 0; i < n; i++)
printf("%d ", pos[i] + 1);
printf("\n");
}
return ;
}
for(int j = 0; j <n; j++)//从第零列开始摆放
{
if(!col[j] && (!l[k + j]) && !r[k - j + n])
{
//若该列j没有被占用,且该列的所在的左上和右上对角线没有皇后
pos[k] = j;//摆放
col[j] = 1;//标记第j列被使用了
l[k + j] = 1;//标记所在的左对角线被占用
r[k - j + n] = 1;//标记右对角
dfs(k + 1);
//回溯
col[j] = 0;
l[k + j] = 0;
r[k - j + n] = 0;
}
}
}
int main()
{
cin>>n;
dfs(0);
cout<<sum<<endl;
//system("pause");
}