ACM_N皇后问题
N皇后问题
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input:
共有若干行,每行一个正整数N≤12,表示棋盘和皇后的数量;如果N=0,表示结束。
Output:
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input:
1
8
5
0
Sample Output:
1
92
10
解题思路:N皇后问题即任两个皇后都不能处于同一条横行、纵行或斜线上。求解这一问题涉及到试探+回溯算法,用递归就可以将思路清晰地展现出来。我们在试探的过程中,皇后的放置需要检查他的位置是否和已经放置好的皇后发生冲突,为此需要以及检查函数place()来检查当前要放置皇后的位置,是不是和其他已经放置的皇后发生冲突。假设有两个皇后被放置在(i,j)和(k,l)的位置上,明显,当且仅当|i-k|=|j-l| 时,两个皇后才在同一条对角线上。(1)先从首位开始检查,如果不能放置,接着检查该行第二个位置,依次检查下去,直到在该行找到一个可以放置一个皇后的地方,然后保存当前状态,转到下一行重复上述方法的检索。 (2)如果检查了该行所有的位置均不能放置一个皇后,说明上一行皇后放置的位置无法让所有的皇后找到自己合适的位置,因此就要回溯到上一行,重新检查该皇后位置后面的位置。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int queen[],cnt,n; //存放各皇后所在的列号,cnt为解个数
bool place(int row){ /* 检查横列和对角线上是否可以放置皇后 */
for(int i=;i<row;++i){ //和已经摆放好的皇后进行比较
if ((queen[i]==queen[row]) || (abs(queen[i]-queen[row])==abs(row-i)))
return false;
}
return true;
}
void QueenSet(int row){/* 回溯尝试皇后位置,row为横坐标 */
for(int col=;col<n;++col){ //首先将皇后放在第0列的位置,对于第一次来说是肯定成立的
queen[row]=col;/* 将皇后摆到当前循环到的位置 */
if(place(row)){//如果放置成功
if(row==n-)++cnt;/* 如果全部摆好,则解的个数加1 */
else QueenSet(row+);/* 否则继续摆放下一个皇后 */
}//这里递归时已经将当前地址压进栈中
}//所以当所在行的所有列不满足时,便会出栈,即回溯,返回到上一行的下一列
}
int main(){
while(cin>>n && n){
cnt=;//解的个数
QueenSet();/* 从横坐标为0开始依次尝试 */
cout<<cnt<<endl;
}
return ;
}
而杭电hdu2553这题却需要先打表,不然会超时,题目给出的N最大为10。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
AC代码:
#include<bits/stdc++.h>
using namespace std;
int queen[],num[],cnt,n,N; //存放各皇后所在的列号,cnt为解个数,num数组记录每n个皇后的解
bool place(int row){ /* 检查横列和对角线上是否可以放置皇后 */
for(int i=;i<row;++i){ //和已经摆放好的皇后进行比较
if ((queen[i]==queen[row]) || (abs(queen[i]-queen[row])==abs(row-i)))
return false;
}
return true;
}
void QueenSet(int row){/* 回溯尝试皇后位置,row为横坐标 */
for(int col=;col<n;++col){ //首先将皇后放在第0列的位置,对于第一次来说是肯定成立的
queen[row]=col;/* 将皇后摆到当前循环到的位置 */
if(place(row)){//如果放置成功
if(row==n-)++cnt;/* 如果全部摆好,则解的个数加1 */
else QueenSet(row+);/* 否则继续摆放下一个皇后 */
}
}
}
int main(){
for(n=;n<;++n){
cnt=;//解的个数
QueenSet();/* 从横坐标为0开始依次尝试 */
num[n]=cnt;
}
while(cin>>N && N)
cout<<num[N]<<endl;
return ;
}
ACM_N皇后问题的更多相关文章
- 递归实现n(经典的8皇后问题)皇后的问题
问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...
- 八皇后算法的另一种实现(c#版本)
八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...
- [LeetCode] N-Queens II N皇后问题之二
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- [LeetCode] N-Queens N皇后问题
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
- N皇后问题—初级回溯
N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...
- 数据结构0103汉诺塔&八皇后
主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...
- N皇后问题
题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...
- LeetCode:N-Queens I II(n皇后问题)
N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...
- 八皇后问题_Qt_界面程序实现
//核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...
随机推荐
- JVM 总结
面试 java 虚拟机 jvm 基础 jvm Write Once Run EveryWhere >jar 包可以在任何兼容jvm上运行 >jvm 适配器 屏蔽掉底层差异 >内存管理 ...
- Web 后端编程的几个关键点(总结中...)
基础 服务端结构 服务器如何部署,负载均衡,代理技术,如何向B端提供服务? 分布式架构 与前端界面的交互形式 数据 CURD 表之间的关联 较为棘手 如何将一对多 多对多的概念进行 面向对象 描述 前 ...
- JSTL-格式标签库
主页:http://www.cnblogs.com/EasonJim/p/6958992.html的分支页. 一.<fmt:formatNumber> <fmt:formatNumb ...
- delphi异步选择模型编程TCP
Server端: unit U_FrmServer; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, ...
- dubbo的jmeter压测时jar包的热加载/动态加载
在做dubbo的jmeter压测时,需要把jar包放入jmeter的lib/ext目录下,但是jmeter启动的时候会自动加载这个目录lib目录及lib/ext目录,这样启动后放入这些目录下的jar包 ...
- C++开发人脸性别识别教程(16)——视频人脸性别识别
在之前的博文中我们已经可以顺利驱动摄像头来採集源图像.在这篇博文中将正式为其加入性别识别的代码,实现摄像头视频的人脸性别识别. 一.人脸检測 在得到摄像头採集的源图像之后,首先要做的就是对其进行人脸检 ...
- iOS 代码安全加固--反编译和代码混淆
一.class-dump反编译 1.将打包的ipa反编译下,.ipa改成.zip,并解压 6.右击—显示包内容,找到如下有个白框黑底的 7.将其复制到桌面xx文件夹中,在终端中输入相关命令 cd 进 ...
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
IT咨询顾问:一次吐血的项目救火 年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...
- PHP连接数据库(注冊页面的增删改查)
1.连接数据库 ---------–connect.php--------------– <?php //本地測试 $host = '127.0.0.1'; $port = 3306; $use ...
- openwrt-安装-驱动-应用-lcd2004a实验
1. 板子f403tech的RT5350的板子和 (1)openWRT系统的定义和特点 OpenWrt是一个高度模块化.高度自己主动化的嵌入式Linux系统.拥有强大的网络组件.经常被 ...