【题解】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,写下这篇博文也是为了回顾一下回溯算法设计吧. 学习回溯算法问题,最为经典的问题我想应该就是八皇后 ...
随机推荐
- YOU AND ME 不见不散(转载)
(看到一篇挺不错的文章,看了挺有感触的,与大家共勉.) 泰戈尔说: 有一个夜晚,我烧毁了所有的记忆, 从此我的梦就透明了: 有个早晨我扔掉了所有的昨天, 从此我的脚步就轻盈了! 越过山丘,才发现无人等 ...
- Luogu4528 CTSC2008 图腾 树状数组、容斥
传送门 设$f_i$表示$i$排列的数量,其中$x$表示不确定 那么$$ans=f_{1324}-f_{1432}-f_{1243}=(f_{1x2x}-f_{1423})-(f_{14xx}-f_{ ...
- Luogu P3398 仓鼠找sugar
这还是一道比较好的树剖题(去你的树剖,LCA即可) 这里主要讲两种思路,其实都是很基本也很经典的 1 树链剖分 还是先讲一下这种算法吧,虽然写起来很烦(不过感觉写多了就习惯了,而且还有一种莫名的快感) ...
- JQuery如何实现双击事件时不触发单击事件
单击和双击事件的执行顺序: 单击(click):mousedown,mouseout,click: 双击(dblclick):mousedown,mouseout,click , mousedown, ...
- JVM规范系列第6章:Java虚拟机指令集
一条 Java 虚拟机指令由一个特定操作的操作码和零至多个操作所使用到的操作数所构成. 虚拟机指令 = 操作码 + 操作数. 其中,操作码值分别为 254(0xfe)和 255(0xff),助记符分别 ...
- 解密自动CPS变换
7.2 1 前言 我最一开始听到 CPS 变换这个词是在王垠的博客里 (请求不要喷我),就是那篇他第一次宣传他的40行代码的文章. 我当时什么都看不懂,所以没太注意,不过我也正在学程序语言方面的东西, ...
- 浏览器跨域请求之credentials
-时间起源- 前段时间,需要弄个简单的网站出来,访问远程的api服务. 我是这么做的.首先是在搭建一个nodejs服务来运行前端页面.在我请求登录的时候,能成功返回相应的成功信息.然后,当我再次请求读 ...
- vue路由\导航刷新后:ative\localStorage\url截取参数
<el-menu :default-active="$route.path" router mode="horizontal"> <el-me ...
- 【Beta阶段】M2事后分析
先上照片,最后一次开会了啊... 计划 你原计划的工作是否最后都做完了? 如果有没做完的,为什么? 答:没有全部做完,到目前为止,我们的还有几个实验的报告生成功能没有上线.这几个实验的数据处理文件已经 ...
- 第三个Sprint冲刺第4天
成员:罗凯旋.罗林杰.吴伟锋.黎文衷 讨论内容:各成员汇报各自完成的情况.