#include<iostream>
#include <algorithm>
using namespace std;
/*
n个皇后
1.不在同一行
2.不在同一列
3.45度的斜线上,行号差值至少为3
横坐标0~~n-1
纵坐标0~~n-1
每个数只能用一次,枚举
固定x坐标,变换y坐标,全排列,检查是否符合条件
*/
class Point
{
int* Px;
int* Py;
int n;
public:
Point()
{
cin >> n;
Px = new int[n];
Py = new int[n];
for (int i = 0; i < n; i++)
{
Px[i] = i;
Py[i] = i;
}
}
~Point()
{
if (Px)
delete[]Px;
if (Py)
delete[]Py;
Px = NULL;
Py = NULL;
}
bool Test(int i,int j)
{
bool f1,f2;
int dy = max(Py[j]-Py[i],Py[i]-Py[j]);
int dx = (max(i, j) - min(i, j));
f1 = (dy == dx);
f2 = (dx < 3);
/*cout << "Py[j]:" << Py[j]<<" "
<< "Px[j]:" << Px[j] << " "
<< "Py[i]:" << Py[i] << " "
<< "Px[i]:" << Px[i] << " dy:";
cout << dy << " dx:" << dx << " ";*/
if (f1 && f2)
{
//cout << "不符合条件" << endl;
return false;
}//不符合条件
else
{
//cout << "符合条件" << endl;
return true;
}
}//两个点进行测试
bool TestAll()
{
bool flag = true;
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
flag = Test(i, j);
if (!flag)
break;
}
if (!flag)
break;
}
return flag;
}//全部进行测试
void Solution()
{
int count = 0;
while (next_permutation(Py, Py + n))
{
//cout << "--------------------------" << endl;
if (TestAll())
count++;
}
if (n == 1)
count = 1;
cout << count;
}
};
int main()
{
Point p;
p.Solution();
system("pause");
return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
/*
n个皇后
1.不在同一行
2.不在同一列
3.45度的斜线上,行号差值至少为3
横坐标0~~n-1
纵坐标0~~n-1
每个数只能用一次,枚举
固定x坐标,变换y坐标,全排列,检查是否符合条件
*/
int QueenPosition[10];
int n;
int cnt;
void NQueen(int k)
{
if (k == n)
{
cnt++;
return;
}//0-k-1已全部排列好
int i, j;
for (i = 0; i < n; i++)//k行i列
{
for (j = 0; j < k; j++)//与前0-k-1进行比较看有无冲突 j行QueenPosition[j]列
{
if (QueenPosition[j] == i)
break;
if (((k - j) < 3) && (abs(k - j) == abs(QueenPosition[j] - i)))
break;
}
if (j == k)
{
QueenPosition[k] = i;
NQueen(k + 1);
}
}
}
int main()
{
cin >> n;
NQueen(0);
cout << cnt;
system("pause");
return 0;
}