1. 暴力n<=15
不附代码,暴力dfs,map数组存可选点逐层搜索,暴力出解。
2. 对判断优化,判断每行,每列,每个左上至右下的斜线,每个右上至左下的斜线能否选点。
(1,1) (2,1)
(1,2) (2,2)
左上到右下的每条线共性:任何线上有全部点(i,j)能有i-j+k(k为任意常数,此处取n为佳)=定值
右上至左下某线上则有任意点 (i,j)有i+j=定值
附代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 305
using namespace std;
int a[N],b[N<<1],c[N<<1],n;
int dfs(int x,int y)
{
int i,s,t;
if(a[y]||b[x+y]||c[x-y+n])return 0;
if(x==n)
{
printf("%d ",y);
return 1;
}
a[y]++;
b[x+y]++;
c[x-y+n]++;
for(i=1;i<=n;i++)
{
if(dfs(x+1,i))
{
printf("%d ",y);
return 1;
}
}
a[y]--;
b[x+y]--;
c[x-y+n]--;
return 0;
}
int main()
{
//freopen("test.in","r",stdin);
while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
{
if(dfs(1,i))
{
printf("\n");
break;
}
}
}
return 0;
}
3. 构造法:(某神犇推出,Orz)
转载自:http://blog.youkuaiyun.com/lyy289065406/article/details/6642789
构造法公式(序列):
一、当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],[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 ] (k为奇数,n为奇数)
不附代码啦,自己写吧!现在可以轻松水过了!
大家可以无视这'[',']'比如[2,4,6,8,...,n],[1,3,5,7,...,n-1],n=10时可以视为2,4,6,8,10,1,3,5,7,9.