「JoyOI1080」N皇后
这是菜鸡的我第一次写这类题目:
题意:就是在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皇后的更多相关文章
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
- 「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 =& ...
随机推荐
- Scala面向对象编程与类型系统
Scala支持面向对象编程, 其面向对象特性与Java有共同之处并添加了很多新的特性. 类定义 scala使用class关键字定义类: class MyComplex(real0:Double, im ...
- .Net Core 简单定时任务框架封装
有段日子没有更新,写点东西冒个泡 .这篇文章过来讲个小东西,也是大家在日常开发中也经常需要面临的问题:后台定时任务处理.估计大家看到这句就已经联想到 QuartZ 等类似第三方类库了,不好意思,后边的 ...
- VB.NET datagridview的操作
'空值判斷 If IsDBNull(DataGridView1.Item(1, 1).Value) = True Then DataGridView1.Item(1, 1).Value = " ...
- 【Spring】15、spring mvc路径匹配原则
Ant path 匹配原则 在Spring MVC中经常要用到拦截器,在配置需要要拦截的路径时经常用到<mvc:mapping/>子标签,其有一个path属性,它就是用来指定需要拦截的路径 ...
- js 前端有消息了 声音提示给用户
前言:工作中有需求,在数据变更有变更时采用声音提示给用户,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9936180.html 网站地址:我的个 ...
- Flask的Context(上下文)学习笔记
上下文是一种属性的有序序列,为驻留在环境内的对象定义环境.在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步.事务.实时激活.安全性等等. 比如在计算机中,相对于进程而言,上下文就是进 ...
- JQuery基本知识汇总;JQuery常用方法;浅入了解JQuery
一.jQuery对象与JavaScript对象 ①JavaScript入口函数比jQuery入口函数执行的晚一些: JQuery的入口函数会等页面加载完成才执行,但是不会等待图片的加载: JavaSc ...
- 微信小程序 数组索引 data-“”解释
按照官方最新文档循环的方式,索引值是以 wx:for-index="index" 方式写的, 以 parseInt(event.currentTarget.dataset.i ...
- Django ModelForm 校验数据格式
发现ModelForm很好用,用来做form表单验证效果很好.但是也要注意几点. forms的用法: 使用默认方式:继承forms.Form类,类里面的字段名称一定要和前端HTML里面的form表单里 ...
- Expo大作战(三十一)--expo sdk api之Payments(expo中的支付),翻译这篇文章傻逼了,完全不符合国内用户,我只负责翻译大家可以略过!
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...