#include<bits/stdc++.h>
using namespace std;
int a[1000]={0},b[1000]={0},c[1000]={0},d[1000]={0},n,s;
//a存行
//b存列
//c存左下到右上的对角线(行+列的和相同)
//d存右下到左上的对角线(行-列的差相同)
//清零数组
void print(){
int i;
s++;
if(s<=3){
for(i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
}
int search(int i){
int j;
for(j=1;j<=n;j++){
if(b[j]==0&&c[i+j]==0&&d[i-j+n]==0){//判断
a[i]=j;//写进去(第i行第j个)
b[j]=1;//占行
c[i+j]=1; d[i-j+n]=1;//占对角线
if(i==n)print();//满足条件输出
else search(i+1);//继续推
b[j]=0;c[i+j]=0;d[i-j+n]=0;//回溯
}
}
}
int main(){
cin>>n;
search(1);
cout<<s<<endl;
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define max 8
int queen[max], sum=0; /* max为棋盘最大坐标 */
void show() /* 输出所有皇后的坐标 */
{
int i;
for(i = 0; i < max; i++)
{
printf("(%d,%d) ", i, queen[i]);
}
printf("\n");
sum++;
}
int check(int n) /* 检查当前列能否放置皇后 */
{
int i;
for(i = 0; i < n; i++) /* 检查横排和对角线上是否可以放置皇后 */
{
if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == (n - i))
{
return 1;
}
}
return 0;
}
void put(int n) /* 回溯尝试皇后位置,n为横坐标 */
{
int i;
for(i = 0; i < max; i++)
{
queen[n] = i; /* 将皇后摆到当前循环到的位置 */
if(!check(n))
{
if(n == max - 1)
{
show(); /* 如果全部摆好,则输出所有皇后的坐标 */
}
else
{
put(n + 1); /* 否则继续摆放下一个皇后 */
}
}
}
}
int main()
{
put(0); /* 从横坐标为0开始依次尝试 */
printf("%d", sum);
return 0;
}