#include<iostream>
#include<algorithm>
#include<string.h>
int n,sum,s;
bool b[11][11];
using namespace std;
int main()
{
void dfs(int,int,int);
while (cin >> n)
{
sum = 0; s = 0;
memset(b, false, sizeof(b));
dfs(1,1,0);
cout << s << endl;
}
return 0;
}
void dfs(int q,int w,int sum)
{
if (sum == n)
{
s++; return;
}
bool can(int, int);
for (int i = q; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (b[i][j]==false&&can(i, j))
{
sum++;
b[i][j] = true;
dfs(i+1,j,sum);
sum--;
b[i][j] = false;
}
if (j == n) return;
}
}
}
bool can(int x, int y)
{
bool a = 0;
for (int i = 1; ; i++)
{
if (x + i <= n)
{
if (b[x + i][y] == true) return false;
}
else break;
}
for (int i = 1; ; i++)
{
if (x - i >= 1)
{
if (b[x - i][y] == true) return false;
}
else break;
}
for (int i = 1; ; i++)
{
if (y + i <= n)
{
if (b[x][y + i] == true) return false;
}
else break;
}
for (int i = 1; ; i++)
{
if (y - i >= 1)
{
if (b[x][y - i] == true) return false;
}
else break;
}
for (int i = 1; ; i++)
{
if (x + i <= n&&y + i <= n)
{
if (b[x + i][y + i] == true) return false;
}
else break;
}
for (int i = 1; ; i++)
{
if (x + i <= n&&y - i >= 1)
{
if (b[x + i][y - i] == true) return false;
}
else break;
}
for (int i = 1; ; i++)
{
if (x - i >= 1 && y + i <= n)
{
if (b[x - i][y + i] == true) return false;
}
else break;
}
for (int i = 1; ; i++)
{
if (x - i >= 1 && y - i >= 1)
{
if (b[x - i][y - i] == true) return false;
}
else break;
}
return true;
}
n*n的房间 n个皇后 按题意,每行都要放一个,且只能放一个,所以只要放好一个,直接递归下一行便可,每当到一行的最后一个便可return;
没想到这样之后时间依然超时,无奈之下只好用以上程序打表。ac代码如下
#include<iostream>
using namespace std;
int main()
{
int a[12];
a[1] = 1; a[2] = 0; a[3] = 0; a[4] = 2; a[5] = 10;
a[6] = 4; a[7] = 40; a[8] = 92; a[9] = 352;
a[10] = 724; a[11] = 2680;
int n;
while (cin >> n&&n)
{
cout << a[n] << endl;
}
return 0;
}