【题解】N皇后
题目描述
相信大家都听过经典的“八皇后”问题吧?这个游戏要求在一个8×8的棋盘上放置8个皇后,使8个皇后互相不攻击(攻击的含义是有两个皇后在同一行或同一列或同一对角线上)。
桐桐对这个游戏很感兴趣,也很快解决了这个问题。可是,他想为自己增加一点难度,于是他想求出n皇后的解的情况。
你能帮助她吗?
输入输出格式
输入格式
一行,仅有一个数n(1≤n≤14),表示为n皇后问题。
输出格式
输出仅有一个数,表示n皇后时问题的解法总数。
输入输出样例
输入样例
8
输出样例
92
题解
经典dfs题。在搜索的时候枚举位置显然会超时,我们可以用三个数组分别记录当前列和当前两条对角线是否有被使用。具体细节如下。
#include<iostream> using namespace std; int n;
int ans;
int a[],b[],c[]; void Queen(int x)
{
if(x>n)
{
ans++;
return;
} for(int y=;y<=n;y++)
if(!a[y]&&!b[x-y+n]&&!c[x+y-])
{
a[y]=b[x-y+n]=c[x+y-]=;
Queen(x+);
a[y]=b[x-y+n]=c[x+y-]=;
}
} int main()
{
cin>>n;
Queen();
cout<<ans; return ;
}
参考程序
但是极限数据还是可以把这个程序卡掉。我们可以思考,其实棋盘的摆放是满足对称性的,第一行我们只需要搜索一半就行了,这样就将时间复杂度缩小一半,刚好可以卡过。
#include<iostream> using namespace std; int n;
int ans;
int a[],b[],c[]; void Queen(int x)
{
if(x>n)
{
ans++;
return;
} if(x==)
{
for(int y=;y<=n/;y++)
if(!a[y]&&!b[x-y+n]&&!c[x+y-])
{
a[y]=b[x-y+n]=c[x+y-]=;
Queen(x+);
a[y]=b[x-y+n]=c[x+y-]=;
}
}
else
{
for(int y=;y<=n;y++)
if(!a[y]&&!b[x-y+n]&&!c[x+y-])
{
a[y]=b[x-y+n]=c[x+y-]=;
Queen(x+);
a[y]=b[x-y+n]=c[x+y-]=;
}
}
} void Queen2(int x)
{
if(x>n)
{
ans++;
return;
} if(x==)
for(int y=n/+;y<=n/+;y++)
if(!a[y]&&!b[x-y+n]&&!c[x+y-])
{
a[y]=b[x-y+n]=c[x+y-]=;
Queen(x+);
a[y]=b[x-y+n]=c[x+y-]=;
}
else
for(int y=;y<=n;y++)
if(!a[y]&&!b[x-y+n]&&!c[x+y-])
{
a[y]=b[x-y+n]=c[x+y-]=;
Queen(x+);
a[y]=b[x-y+n]=c[x+y-]=;
}
} int main()
{
cin>>n;
Queen();
ans*=;
if(n%==) Queen2(); cout<<ans; return ;
}
参考程序
观察搜索过程,我们在枚举可放位置上花费了很多时间,其实我们可以直接用三个二进制数来表示当前行的可放位置,用lowbit来提取就行了。
#include <iostream> using namespace std; int n;
int lim;
int ans; void DFS(int a, int b, int c)
{
if(a == lim)
{
++ans;
return;
}
int tmp = lim & ~(a | b | c) , pos;
while(tmp)
{
pos = tmp & -tmp;
tmp -= pos;
DFS(a + pos, b + pos >> , c + pos << );
}
return;
} int main()
{
cin >> n;
lim = ( << n) - ;
int mid = << (n >> );
for(register int i = ; i < mid; i <<= )
{
DFS(i, i >> , i << );
}
ans <<= ;
if(n & ) DFS( << (n >> ), << (n >> ) - , << (n >> ) + );
// DFS(0, 0, 0);
cout << ans;
return ;
}
参考程序(位运算优化)
【题解】N皇后的更多相关文章
- [题解]N 皇后问题总结
N 皇后问题(queen.cpp) [题目描述] 在 N*N 的棋盘上放置 N 个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置 2 个皇后) ,编程求解所有的 ...
- 我对DFS的理解
我对DFS的理解 [何为DFS] 深度优先搜索(Depth-First-Search),简称DFS.是一种常见搜索算法.其方法是从原点不断一条路扩散,当无路可走时回退来走下一条路,直至找到目标或遍历. ...
- 八皇后O(1)算法题解
题目描述 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上.问共有多少种不同的方法,并且按字典序从小到大指出各种不同的放法. 题解 见证奇迹的时 ...
- HDU 2553 N皇后问题(详细题解)
这是一道深搜题目!问题的关键是在剪枝. 下面我们对问题进行分析: 1.一行只能放一个皇后,所以我们一旦确定此处可以放皇后,那么该行就只能放一个皇后,下面的就不要再搜了. 2.每一列只能放一个皇后,所以 ...
- PAT甲题题解-1128. N Queens Puzzle (20)-做了一个假的n皇后问题
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789810.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- 洛谷 P1219 八皇后题解
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 题解 洛谷P1562 【还是N皇后】
原题:洛谷P1562 这个题的原理和8皇后的原理是一模一样的,就是必须要用n个皇后把每一个行填满,同时满足每一列,每一行,每一条对角线只有一个棋子.但如果按照原来的方法暴打的话只有60分(优化亲测无效 ...
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...
- 回溯算法之n皇后问题
今天在看深度优先算法的时候,联想到DFS本质不就是一个递归回溯算法问题,只不过它是应用在图论上的.OK,写下这篇博文也是为了回顾一下回溯算法设计吧. 学习回溯算法问题,最为经典的问题我想应该就是八皇后 ...
随机推荐
- mysql导出CSV格式的文件
select * from Account into outfile "/tmp/haha.csv" fields terminated by ',' lines term ...
- 2-物联网开发标配方案(51单片机程序介绍+WIFI程序介绍)
上一节 https://www.cnblogs.com/yangfengwu/p/9944438.html 购买云服务器安装MQTT就不用说了,以前写过文章介绍 https://www.cnblog ...
- https原理简析
[转]http://www.cnblogs.com/carsonzhu/p/5225778.html HTTPS的工作原理 HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手 ...
- 重写Override ToString()方法
使用一个小例子来演示: 创建一个普通类别: class Ax { private int _ID; public int ID { get { return _ID; } set { _ID = va ...
- flask seesion组件
一.简介 flask中session组件可分为内置的session组件还有第三方flask-session组件,内置的session组件功能单一,而第三方的flask-sessoin可支持re ...
- RabbmitMQ-组成及简单使用
什么是MQ? MQ全程Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费者-生产者模型的典型代表.一端往消息队列中不断写消息而另一端则可以读取队列中的消息. R ...
- STM32 M3内核的位带操作原理及步骤
STM32 M3内核的位带操作原理及步骤 一.位带操作有什么用?什么是位带操作 位带操作的作用:可以实现对某一GPIO口寄存器(或SRAM内存中)的某一bit位直接写0或1,达到控制GPIO口输出(或 ...
- 编写自己的dapper lambda扩展-使用篇
前言 这是针对dapper的一个扩展,支持lambda表达式的写法,链式风格让开发者使用起来更加优雅.直观.现在暂时只有MsSql的扩展,也没有实现事务的写法,将会在后续的版本补充. 这是个人业余的开 ...
- Centos下安装破解confluence6.3的操作记录
confluence是一个专业的企业知识管理与协同软件,可以用于构建企业wiki.通过它可以实现团队成员之间的协作和知识共享.现在大多数公司都会部署一套confluence,用作内部wiki.现在co ...
- Mysql基于GTID复制模式-运维小结 (完整篇)
先来看mysql5.6主从同步操作时遇到的一个报错:mysql> change master to master_host='192.168.10.59',master_user='repli' ...