#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int vis[3][100], n, tot = 0, C[100], ans[100005][30], b[100005];
void search (int cur)
{
if (cur == n + 1)
{
tot++;
for (int i = 1; i <= n; i++)
{
//printf("%d ", C[i]);
ans[tot][i] = C[i];
}
b[tot] = C[1];
}
else for (int i = 1 ; i <= n; i++)
{
if (!vis[0][i] && !vis[1][cur + i] && !vis[2][cur - i + n]) //利用二维数组直接判断
{
C[cur] = i;
vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1;
search(cur + 1);
vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0;
}
}
}
int main()
{
//memset(vis, 0, sizeof(vis));
scanf("%d", &n);
search(1);
sort(b, b + tot);
int sum = 1;
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= n; j++)
{
if (ans[j][1] == b[i])
{
if (sum <= 3)
{
for (int k = 1; k <= n; k++)
{
printf("%d ", ans[j][k]);
}
printf("\n");
sum++;
}
}
}
}
printf("%d\n", tot);
return 0;
}
用了紫书上第二种search函数,蓝后乱搞了一下,调了调,过了。
数组千万不能开小!!!!
【想乱搞第一种来没成功qnq我N皇后调了一天啊一天!!!!】