「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 =& ...
随机推荐
- 将应用代码由eclipse导入Android studio的方法NDK-Build和Cmake两种方法(以android_serialport_api为例)
网上翻了几百篇博客,看了半天,要不就是写的乱七八糟看不懂,要不就是隐藏了一些细节,要不就是实现不了,最后还是在Android官网上看明白了,而且说得有条有理,以后遇到不懂的一定要先翻官网. 参考资料: ...
- 公众号第三方平台开发 教程六 代公众号使用JS SDK说明
公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...
- LeetCode 任务调度器-Python3<八>
题目:https://leetcode-cn.com/problems/task-scheduler/description/ 给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 ...
- asp.net前台页面与后台之间传值,
在前台用 js 获取到的 “值 ”需要传到后台,在后台调用, ****** 原有传入的 “值 ” 不要被覆盖 1.最简单的在页面写一个隐藏表单,隐藏标签,把获取到的值赋给隐藏标签之后 ...
- 近期ASP.NET问题汇总及对应的解决办法
1. 使用SQL统计一个字符串中指定字符的个数,示例(统计0的个数): ','')) 2. 使用Forms认证,客户端本地时间不对无法登陆系统,解决办法: FormsAuthentication.Re ...
- 通过kubernetes构建ela服务
一.kubernetes 通过yaml 创建pod与service apiVersion: extensions/v1beta1 kind: Deployment metadata: name: el ...
- css文本溢出隐藏显示省略号(单行+多行)
文本超出若干行就换行,这个功能几乎每个文本浏览网站都会用到,实现它的办法也有很多,今天简单的介绍一下实现它的方法. 一. 单行文本不换行,并将超出文本隐藏 .box-content{ ove ...
- Python 练习: 简单角色游戏程序
要求: 1.创建三个游戏人物,分别是: 苍井井,女,18,初始战斗力1000 东尼木木,男,20,初始战斗力1800 波多多,女,19,初始战斗力2500 2.游戏场景,分别: 草丛战斗,消耗200战 ...
- sql server: left join 重复数据
---涂聚文 2017-9-28 SELECT VipExamMailProjectId,VipExamMailStaffID FROM VipExamMailRecord WHERE VipExam ...
- Loadrunner 脚本开发-soap_request函数介绍及WebService接口测试
脚本开发- soap_request函数介绍及WebService接口测试 by:授客 QQ:1033553122 函数介绍 soap_request 函数执行一个SOAP请求 函数原型 int so ...