您的位置:首页 > 其它

N皇后问题 1.dfs 2.位运算解决

2014-04-19 16:32 267 查看
1.dfs解法应该没什么好说了,入门dfs题

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int tot;
int n;
int c[10000];
void dfs(int cur)
{
    if(cur==n)
    {
        tot++;
        /*for(int i=0;i<n-1;i++)    //输出路径
        printf("%d ",c[i]);
        printf("%d\n",c[n-1]);*/
        return ;
    }
    for(int i=0;i<n;i++)
    {
        int ok=1;
        c[cur]=i;
        for(int j=0;j<cur;j++)
        {
            if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j])
            {
                ok=0;break;
            }
        }
        if(ok) dfs(cur+1);
    }
}
int main()
{
    while(scanf("%d",&n),n)
    {
      tot=0;
      dfs(0);
      printf("%d\n",tot);
    }
    return 0;
}


2.位运算解决(效率更高)

#include<stdio.h>
#include<string.h>
int n,LIM,tot,q[11];
void dfs(int row,int ld,int rd)
{
    if(row==LIM)//当皇后全部放好时,tot自加
    {
        tot++;
        return ;
    }
    int pos=(~(row|ld|rd))&LIM;
    while(pos)
    {
        int p=pos&(~pos+1);//依次取最右边的1
        dfs(row|p,(ld|p)<<1,(rd|p)>>1);
        pos-=p;//完成本层dfs后消去选取位置的p
    }
}
int main()
{
    for(int i=1;i<=10;i++)
    {
        LIM=(1<<i)-1;
        tot=0;
        dfs(0,0,0);
        q[i]=tot;
    }
    while(~scanf("%d",&n),n)
    {
        printf("%d\n",q
);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: