3101: N皇后
Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 197 Solved: 108
[Submit][Status][Discuss]
Description
n*n的棋盘,在上面摆下n个皇后,使其两两间不能相互攻击…
Input
一个数n
Output
第i行表示在第i行第几列放置皇后
Sample Input
4
Sample Output
2
4
1
3
经典构造问题
很容易想到2 4 6 … 1 3 5这样摆,
但是当n%6==2或n%6==3的时候不符合条件
这时令k=(int)(n/2)
分成四种情况
①k为偶数,n为偶数
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,n
③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
#include<stdio.h>
int main(void)
{
int n, i;
while(scanf("%d", &n)!=EOF)
{
if(n%6!=2 && n%6!=3)
{
for(i=2;i<=n;i+=2)
printf("%d\n", i);
for(i=1;i<=n;i+=2)
printf("%d\n", i);
}
else
{
if((n/2)%2==0)
{
for(i=n/2;i<=n;i+=2)
printf("%d\n", i);
for(i=2;i<=n/2-1;i+=2)
printf("%d\n", i);
for(i=n/2+3;i<=n-1;i+=2)
printf("%d\n", i);
for(i=1;i<=n/2+1;i+=2)
printf("%d\n", i);
}
else
{
for(i=n/2;i<=n-1;i+=2)
printf("%d\n", i);
for(i=1;i<=n/2-1;i+=2)
printf("%d\n", i);
for(i=n/2+3;i<=n;i+=2)
printf("%d\n", i);
for(i=2;i<=n/2+1;i+=2)
printf("%d\n", i);
}
if(n%2==1)
printf("%d\n", n);
}
}
return 0;
}