这是菜鸡的我第一次写这类题目:

题意:就是在N*N的棋盘上,每一行,每一列,所有的对角线都只能有一个棋子。

先分析:假若N=4;

    则为其中的一种答案。要输出左右的解,肯定要枚举出所有的解。那么非常自然的想到递归!

  根据题意,每一步棋子都满足,在一行,一列,两个对角线。那么怎么解决呢?

  总体递归思路,肯定是以一行为处理单位的啦。每一行总从左到右是判断是否这个棋子可以判断。

不相邻行的两个棋子:

在这里,我们先解决不为相邻行时,两个棋子不同列不同对角线问题。

不同列:直接定义一个数组,比如b[ 1 ]=1就表示第1列已经摆了一个棋子了。那么后面的棋子直接判断就行了。

不同列:

      很明显在出现这种情况之前一定会出现这种摆法:所以根本不用担心这种情况的发生。

相邻行的两个棋子:

我们解决怎样判断同一列,在两个对角线中。

不同列:直接定义一个数组,比如b[ 1 ]=1就表示第1列已经摆了一个棋子了。那么后面的棋子直接判断就行了。

对角线一:  假设第一个点坐标为(x, y)那么,相邻行并且同对角线的下一个点的坐标是就是(x+1, y-1),对吧。是不是找到规律了。

     x+y=(x+1)+(y-1)  这样就定义一个数组c[],  那么 c[x+y]=1就可以表示点(x, y)所在的这类这条对角线已经有一个棋子。

对角线二:这类对角线的上的点的坐标变化都是横纵坐标各自加1.这其实很好办,每个坐标都满足x-y+n=k,每一条对角线对应唯一的一          

           个k值.至于x,y谁在前谁在后都无所谓,关键是抵消加1这个操作。那么定义d[ x-y+n ]=1表示这个对角线已经有了一个棋子。

#include<iostream>
using namespace std;
int n, sum, a[];
bool b[], c[], d[];
void print(){
sum++;
if (sum <= ){
for (int i = ; i <= n; ++i)
{
cout << a[i] << " \n"[(i != n ? : )];
}
}
}
void queen(int i)
{
for (int j = ; j <= n; ++j)
{
if ((b[j] == ) && (c[i + j] == ) && (d[i - j+n] == ))
{
a[i] = j;
b[j] = ;
c[i + j] = ;
d[i - j + n] = ;
if (i == n)print();
else queen(i + );
b[j] = ;
c[i + j] = ;
d[i - j + n] = ;
}
}
}
int main()
{
cin >> n;
queen();
cout << sum << endl;
return ;
}

「JoyOI1080」N皇后的更多相关文章

  1. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  2. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  3. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  4. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  5. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  6. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  7. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  8. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

  9. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

随机推荐

  1. 再会,OI

    现在时间是一八年的七月二十一日下午,NOI2018 闭幕式已经结束.嗯,结束了... 谢绝了李总的好意也没有让父母来接,有段路还是要自己一个人走的... 总结一下 NOI ...其实也没有什么好总结的 ...

  2. java中Map集合的理解

    Map |--Hashtable:底层是哈希表数据结构,不可以存入null键null值.该集合是线程同步的.jdk1.0.效率低. |--HashMap:底层是哈希表数据结构,允许使用 null 值和 ...

  3. MONGODB(四)——DBObject与JavaBean转换

    一.DBObject 转为 JavaBean /** * 将实体Bean对象转换成DBObject * */ public static <T> DBObject beanToDBObje ...

  4. Task.Run Vs Task.Factory.StartNew 【收藏】

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  5. oracle用户权限

    权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...

  6. C#日期转换(转载)

    转载来源:https://www.cnblogs.com/johnblogs/p/5912632.html DateTime.ToString()的各种日期格式 例: ToString:2016/9/ ...

  7. Why does the C# compiler translate this != comparison as if it were a > comparison?

    Question: I have by pure chance discovered that the C# compiler turns this method: static bool IsNot ...

  8. Canvas-line.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 洛谷P3721 [AH2017/HNOI2017]单旋(线段树 set spaly)

    题意 题目链接 Sol 这题好毒瘤啊.. 首先要观察到几个性质: 将最小值旋转到根相当于把右子树变为祖先的左子树,然后将原来的根变为当前最小值 上述操作对深度的影响相当于右子树不变,其他的位置-1 然 ...

  10. 【代码笔记】Web-HTML-颜色

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...