N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6493    Accepted Submission(s): 2951

Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

 
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 
Sample Input
1
8
5
0
 
Sample Output
1
92
10
 
Author
cgf
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  2614 1258 1426 1175 1067 
 
 //31MS    256K    993 B    C++
//经典N皇后问题 深搜解法
#include<stdio.h>
#include<string.h>
int cnt,n;
int q[][];
int Judge(int x,int y)
{
for(int i=;i<n;i++) if(q[x][i] && i!=y) return ;
for(int i=;i<n;i++) if(q[i][y] && i!=x) return ;
for(int i=x+,j=y+;i<n && j<n;i++,j++)
if(q[i][j]) return ;
for(int i=x-,j=y-;i>= && j>=;i--,j--)
if(q[i][j]) return ;
for(int i=x+,j=y-;i<n && j>=;i++,j--)
if(q[i][j]) return ;
for(int i=x-,j=y+;i>= && j<n;i--,j++)
if(q[i][j]) return ;
return ;
}
void dfs(int c)
{
if(c==n){ cnt++;return;}
for(int i=;i<n;i++)
if(Judge(i,c)){
q[i][c]=;
dfs(c+);
q[i][c]=;
}
}
int main(void)
{
int a[]={};//不打表会超时
for(int i=;i<;i++){
n=i;
cnt=;
memset(q,,sizeof(q));
dfs();
a[i]=cnt;
}
while(scanf("%d",&n)!=EOF && n)
{
printf("%d\n",a[n]);
}
return ;
}

给出一个高效的位运算求法:

 //15MS    208K    704 B    G++
#include<stdio.h>
int ans[];
int sum;
int upperlim;
void dfs(int row,int ld,int rd) //某行中纵列不可取,左右对角线不可取的限制条件
{
int pos,p;
if(row!=upperlim){
pos=upperlim&(~(row|ld|rd)); //取出可以放的位置
while(pos){
p=pos&(~pos+); //取pos最左边的1
pos=pos-p; //减去可取的
dfs(row|p,(ld|p)<<,(rd|p)>>); //深搜
}
}else sum++; //搜出来后总数+1
}
int main(void)
{
for(int i=;i<;i++){
sum=;
upperlim=(<<i)-; //i个1
dfs(,,);
ans[i]=sum;
}
int n;
while(scanf("%d",&n),n)
{
printf("%d\n",ans[n]);
}
return ;
}

hdu 2553 N皇后问题 (DFS)的更多相关文章

  1. HDU 2553(N皇后)(DFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=2553 i表示行,map[i]表示列,然后用DFS遍历回溯 可以参考这篇文章: http://blog.csdn. ...

  2. [HDU 2553]--N皇后问题(回溯)/N皇后问题的分析

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)     ...

  3. hdu 2553 N皇后问题 (经典DFS)

    题目链接:点击链接 思路:用一维数组hang[num] = i,num表示第num行,i表示第i列,计算n = 1~10皇后的不同放置数量,然后打表 #include<stdio.h> # ...

  4. HDU 2553 N皇后问题(dfs)

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在 ...

  5. hdu 2553 n皇后问题【DFS递归解法】

    <题目链接> 题目大意: Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45 ...

  6. HDU 2553 N皇后问题(深搜DFS)

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. hdu 2553:N皇后问题(DFS遍历,水题)

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. HDU 2553 N皇后问题【棋盘型DFS】

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. HDU 2553 N皇后问题(详细题解)

    这是一道深搜题目!问题的关键是在剪枝. 下面我们对问题进行分析: 1.一行只能放一个皇后,所以我们一旦确定此处可以放皇后,那么该行就只能放一个皇后,下面的就不要再搜了. 2.每一列只能放一个皇后,所以 ...

随机推荐

  1. JavaScript - 库 jQuery

    测试 JavaScript 框架库 - jQuery 引用JQuery 如需测试JavaScript库,您需要在网页中引用它. 为了引用某个库,请使用<script>标签,其src属性设置 ...

  2. vim编辑器使用习惯问题

    Ubuntu中vi在编辑状态下方向键不能用,一按方向键盘就出ABCD,想插入个字母还非常麻烦,还有回格键不能删除等我们平时习惯的一些键都不能使用. 解决办法: 可以安装vim full版本,在full ...

  3. P2158 [SDOI2008] (欧拉函数

    题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...

  4. 删除警告的方法 python

    import warningswarnings.filterwarnings('ignore')

  5. python——获取数据类型

    在python中,可使用type()和isinstance()内置函数获取数据类型 如: (1)type()的使用方法: >>> a = '230'         >> ...

  6. Go实现mqtt服务

    package main import ( "os" "log" "github.com/eclipse/paho.mqtt.golang" ...

  7. POJ:1222-EXTENDED LIGHTS OUT(矩阵反转)

    EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12956 Accepted: 8186 ...

  8. io编程,python

    IO在计算机中指Input/Output,也就是输入和输出. Stream(流): 可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动.Input Stream就是数据从外面(磁盘.网络)流 ...

  9. 理解JAVA与C的运行机制

    1.java的运行机制 java的编译过程,将java的源程序(扩展名为.java的文件),由java编译程序将java的字节码文件(.class文件)在jvm上运行,机器码有cpu运行, jvm编译 ...

  10. Git-补丁文件交互

    版本库间的交互是通过git push和/或git pull命令实现的,这是Git最主要的交互模式,但并不是全部.使用补丁文件是另外一种交互方式,适用于参与者众多的大型项目进行分布式开发. 创建补丁 G ...