ytu 1789:n皇后问题(水题,枚举)
n皇后问题
Time Limit: 1 Sec Memory Limit: 64 MB Special Judge
Submit: 12 Solved: 3
[Submit][Status][Web Board]
Description
在n×n 格的棋盘上放置彼此不受攻击的n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一行或同一列或同一斜线上。 设计一个解n 后问题的队列式分支限界法,计算在n× n个方格上放置彼此不受攻击的n个皇后的一个放置方案。
Input
输入数据只占一行,有1 个正整数n,4≤n≤20。
Output
将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。
Sample Input
Sample Output
HINT
N皇后问题
解决这道问题有两种不同形式的做法:递归和迭代。
递归和迭代有什么区别呢?
现在引用百度知道的一个回答:
简单来说,递归就是自己调用自己,如:
int abc(...)
{
if(...) //递归终止条件
{ return abc(...); }
return ;
} 而迭代是重复一组指令,不断地根据变量的旧值推出新值,如:
for(; ; ;) //迭代终止条件
{
a = b + c;
b = a;
c = a;
}
我想有一部分人也是分不清的吧,包括我自己也是,现在重温一下这两者的区别。
===================================
好了,刚才只是题外话,现在我们回归正题。
不管是递归还是迭代,实际上思路都是一样的。
解题思路:
题目要求任意一横排、一竖列、一斜线上不能有两个皇后,那么我们以行i做一个循环
,每循环一次就确定第i个皇后在第几列。很显然第i个皇后的位置不能和之前(i-1)个皇后的位置重复
,也就是a[i]!=a[1]/a[2]/.../a[i-1],那么写一个递归函数f(i),确定第i个皇后的位置。
下面是我用递归做的代码:
#include <iostream> using namespace std;
int n;
int a[];
bool f(int h)
{
if(h>n)
return true;
if(h==){ //第一个皇后的位置不需要对比
for(int i=;i<=n;i++){
a[h]=i; if(f(h+))
return true;
}
}
else { //从第二个皇后开始位置需要与前面的皇后对比了
for(int i=;i<=n;i++){ //按行循环
int j;
for(j=;j<h;j++) //判断是否一竖列有两个皇后
if(a[j]==i)
break;
if(j<h)
continue;
for(j=;j<h;j++){ //判断是否一斜线上有两个皇后。因为是按行循环,所以不需要判断是否一横行上有两个皇后。
int t=h-j;
if(a[j]+t==i || a[j]-t==i)
break;
}
if(j<h)
continue;
a[h]=i;
if(f(h+)) //判断下一个皇后的位置。
return true;
}
}
return false; //条件都不符合,则说明这种摆法不合适,回溯,换一种摆法。
} int main()
{
cin>>n;
f();
for(int i=;i<=n;i++)
cout<<a[i]<<' ';
return ;
}
Freecode : www.cnblogs.com/yym2013
ytu 1789:n皇后问题(水题,枚举)的更多相关文章
- 洛谷P2038 无线网络发射器选址 水题 枚举
刚开始边界写错了(将128写成127). 注意n <= 20,所以可以每读入一个点就将其周边更新,这样最多也只会有 40 * 40 * 20 种位置需要被枚举. Code: #include&l ...
- ytu 1939:统计元音(水题)
统计元音 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 68 Solved: 33[Submit][Status][Web Board] Descrip ...
- ytu 1910:字符统计(水题)
字符统计 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 421 Solved: 92[Submit][Status][Web Board] Descri ...
- poj1873 The Fortified Forest 凸包+枚举 水题
/* poj1873 The Fortified Forest 凸包+枚举 水题 用小树林的木头给小树林围一个围墙 每棵树都有价值 求消耗价值最低的做法,输出被砍伐的树的编号和剩余的木料 若砍伐价值相 ...
- hdu 2553:N皇后问题(DFS遍历,水题)
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)
1061: 从三个数中找出最大的数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 124[Submit][Status][We ...
- ytu 1059: 判别该年份是否闰年(水题,宏定义)
1059: 判别该年份是否闰年 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 222 Solved: 139[Submit][Status][Web ...
- ytu 1064: 输入三个字符串,按由小到大的顺序输出(水题,字符串处理)
1064: 输入三个字符串,按由小到大的顺序输出 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 471 Solved: 188[Submit][Sta ...
随机推荐
- javascript面向对象方式,调用属性和方法
1.定义一个Person类,其中的属性和方法如果想对外开放,需要使用this,如: var Person=function(name,age,sex){ var psex='Boy'; if(sex) ...
- mybatis使用小记
参考资料:http://blog.csdn.net/hupanfeng/article/details/9098453 1.设置不缓存每次查询的结果: 如题,通过设置 flushCache=" ...
- [名词解释]Constant Amortized Time
http://stackoverflow.com/questions/200384/constant-amortized-time 分摊常量时间: Amortised time explained i ...
- SQL存储过程概念剖析
一.SQL存储过程的概念,优点及语法 定义:将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execut ...
- Dedecms最新版本存储型XSS
由于编辑文章的模板参数 typeid2可控,导致存储XSS发生. dedecms/dede/templets/article_edit.htm页面316-325行代码如下: <tr> &l ...
- C# ManualResetEvent的使用
using System; using System.Threading; public class Example { // mre is used to block and release thr ...
- SpringMVC关于json、xml自动转换的原理研究
SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC ...
- DNS原理及其解析过程【精彩剖析】(转)
2012-03-21 17:23:10 标签:dig wireshark bind nslookup dns 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...
- HLG2035广搜
Diablo Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 42(21 users) Total Accepted: 23(20 us ...
- Java和Python运行速度对比
Java和Python运行速度对比:同一个函数运行一百万次,Java耗时0.577秒,Python耗时78秒--135倍的差距. 版本:Java 8,Python 2.7.10 Java测试代码: i ...