N皇后问题

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.csdn.net/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.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值