hdu 2553 N皇后问题 (DFS)
N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6493 Accepted Submission(s): 2951
你的任务是,对于给定的N,求出有多少种合法的放置方法。
8
5
0
92
10
//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)的更多相关文章
- HDU 2553(N皇后)(DFS)
http://acm.hdu.edu.cn/showproblem.php?pid=2553 i表示行,map[i]表示列,然后用DFS遍历回溯 可以参考这篇文章: http://blog.csdn. ...
- [HDU 2553]--N皇后问题(回溯)/N皇后问题的分析
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 2553 N皇后问题 (经典DFS)
题目链接:点击链接 思路:用一维数组hang[num] = i,num表示第num行,i表示第i列,计算n = 1~10皇后的不同放置数量,然后打表 #include<stdio.h> # ...
- HDU 2553 N皇后问题(dfs)
N皇后问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 在 ...
- hdu 2553 n皇后问题【DFS递归解法】
<题目链接> 题目大意: Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45 ...
- HDU 2553 N皇后问题(深搜DFS)
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 2553:N皇后问题(DFS遍历,水题)
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 2553 N皇后问题【棋盘型DFS】
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 2553 N皇后问题(详细题解)
这是一道深搜题目!问题的关键是在剪枝. 下面我们对问题进行分析: 1.一行只能放一个皇后,所以我们一旦确定此处可以放皇后,那么该行就只能放一个皇后,下面的就不要再搜了. 2.每一列只能放一个皇后,所以 ...
随机推荐
- javascript入门笔记4-数组
1.数组 var arr=new Array(); var myarray= new Array(8); //创建数组,存储8个数据. 注意: 1.创建的新数组是空数组,没有值,如输出,则显示unde ...
- Python 初始—(项目 目录结构)
在os 包下,给出 import os ,os.path.abspath(__file__)获取当前文件的相对路径,os.path.dirname 获取当前文件所在的文件夹目录 print(os.pa ...
- 使用JDBC操作数据库
准备工作 1.创建一个java项目导入mysql驱动包 2.在src目录中创建一个新的Java类 JDBC查询: package com.ATedu.test; import java.sql.Con ...
- java经常看见 jdk5 jdk1.5 —— jdk6 jdk1.6 这两者有什么区别吗?
问.java经常看见 jdk5 jdk1.5 —— jdk6 jdk1.6 这两者有什么区别吗? 答:没有区别,jdk5 和 jdk1.5 所代表的意思是一样的,只是叫法不一样 关键字: jdk5 j ...
- OracleWeblogic12C安装教程
一,安装WebLogic Server 1. 双击exe安装文件 2.准备安装文件 3. 生成向导序列 4. 选择安装路径 5. 开始安装 经过以上步骤,weblogic已经成功安装到了你的电脑上,但 ...
- python__高级 : @修饰器(装饰器)的理解
以下是第一次了解的时候写的东西,有的地方理解不正确,虽已改正但是太片面,请直接看下面第二次修改加上的内容. ---------------------------------------------- ...
- php COM
查看php.ini中是否已经开启了com.allow_dcom = true 从php/ext/里面查找一下有没有这个php_com_dotnet.dll这个文件 如果没有网上下载个,一般都会有的吧应 ...
- 【机器学习算法基础+实战系列】SVM
概述 支持向量机是一种二分类模型,间隔最大使它有别于感知机.支持向量机学习方法由简至繁的模型:线性可分支持向量机(linear support vector machine in linearly s ...
- Python中的str
str_lst = [ ('元素替换',), ('字符串切片',), ('字符串分割',), ('字符串连接',), ('元素计数',), ('寻找元素',), ('判断字符串的开头与结尾',), ( ...
- C语言进阶——有符号与无符号02
在计算机的内部,我们所有的信息都是由二进制数字组成的 有符号数的表实法: 在计算机内部用补码的方式表实有符号数 正数的补码位正数的本身 负数的补码为其绝对值取反然后加一得到 例如-7 他在计算机内部的 ...