您的位置:首页 > 其它

poj 3239(n皇后问题)

2012-10-19 00:18 288 查看
(网上找的。。。)构造法公式(序列):
一、当n mod 6 != 2 && n mod 6 != 3时:

[2,4,6,8,...,n],[1,3,5,7,...,n-1] (n为偶数)

[2,4,6,8,...,n-1],[1,3,5,7,...,n ] (n为奇数)

二、当n mod 6 == 2 或 n mod 6 == 3时

(当n为偶数,k=n/2;当n为奇数,k=(n-1)/2)

[k,k+2,k+4,...,n],[2,4,...,k-2],[k+3,k+5,...,n-1],[1,3,5,...,k+1] (k为偶数,n为偶数)

[k,k+2,k+4,...,n-1],[2,4,...,k-2],[k+3,k+5,...,n-2],[1,3,5,...,k+1],
(k为偶数,n为奇数)

[k,k+2,k+4,...,n-1],[1,3,5,...,k-2],[k+3,...,n],[2,4,...,k+1] (k为奇数,n为偶数)

[k,k+2,k+4,...,n-2],[1,3,5,...,k-2],[k+3,...,n-1],[2,4,...,k+1],[n ] (k为奇数,n为奇数)

(上面有六条序列。一行一个序列,中括号是我额外加上的,方便大家辨认子序列,子序列与子序列之间是连续关系,无视中括号就可以了。第i个数为ai,表示在第i行ai列放一个皇后;... 省略的序列中,相邻两数以2递增。)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

void queens_puzzle(int n)//n>=8
{
if(n%6!=2 && n%6!=3)
{
printf("2");
for(int i=4;i<=n;i+=2)
printf(" %d",i);
for(int i=1;i<=n;i+=2)
printf(" %d",i);
printf("\n");
}
else
{
int k=n/2;
if(n%2==0 && k%2==0)
{
printf("%d",k);
for(int i=k+2;i<=n;i+=2)
printf(" %d",i);
for(int i=2;i<=k-2;i+=2)
printf(" %d",i);
for(int i=k+3;i<=n-1;i+=2)
printf(" %d",i);
for(int i=1;i<=k+1;i+=2)
printf(" %d",i);
}
else if(n%2==1 && k%2==0)
{
printf("%d",k);
for(int i=k+2;i<=n-1;i+=2)
printf(" %d",i);
for(int i=2;i<=k-2;i+=2)
printf(" %d",i);
for(int i=k+3;i<=n-2;i+=2)
printf(" %d",i);
for(int i=1;i<=k+1;i+=2)
printf(" %d",i);
printf(" %d",n);
}
else if(n%2==0 && k%2==1)
{
printf("%d",k);
for(int i=k+2;i<=n-1;i+=2)
printf(" %d",i);
for(int i=1;i<=k-2;i+=2)
printf(" %d",i);
for(int i=k+3;i<=n;i+=2)
printf(" %d",i);
for(int i=2;i<=k+1;i+=2)
printf(" %d",i);
}
else
{
printf("%d",k);
for(int i=k+2;i<=n-2;i+=2)
printf(" %d",i);
for(int i=1;i<=k-2;i+=2)
printf(" %d",i);
for(int i=k+3;i<=n-1;i+=2)
printf(" %d",i);
for(int i=2;i<=k+1;i+=2)
printf(" %d",i);
printf(" %d",n);
}
printf("\n");
}
}

int main()
{
int n;
freopen("input.txt","r",stdin);
freopen("out1.txt","w",stdout);
while(~scanf("%d",&n))
{
if(!n) break;
queens_puzzle(n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: