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[ ...
随机推荐
- Linux下汇编语言学习笔记45 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- Linux下汇编语言学习笔记40 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- IOS7状态栏StatusBar官方标准适配方法
IOS7状态栏StatusBar官方标准适配方法 hello,大家好,ios7正式版已经发布,相信大家都在以各种方式来适配ios7. 如果你已经下载了xcode5,正准备使用,你会发现各种布局的改变. ...
- P2212 [USACO14MAR]浇地Watering the Fields 洛谷
https://www.luogu.org/problem/show?pid=2212 题目描述 Due to a lack of rain, Farmer John wants to build a ...
- IOS推断是否安装微信qq
BOOL weicaht = [[UIApplicationsharedApplication]canOpenURL:[NSURLURLWithString:@"mqqapi://" ...
- 我在CSDN开通博客啦!
今天,我最终在CSDN开通博客啦!
- Lua学习笔记7:时间和日期
lua中的时间类似于C语言中的时间,例如以下: local time = os.time() print(time) local t = os.date("*t") for k,v ...
- [转] Ubuntu/Linux Mint/Debian 安装 Java 8
本PPA由webupd8制作,支持Ubuntu .04以及对应的Linux Mint版本,Oracle Java 8包提供JDK8 和 JRE8. sudo add-apt-repository pp ...
- redis集群状态信息维护脚本
近期在做redis相关的东西.须要把2台redis切分成16个shard. 16个主shard分布在4台128G的机器上,从shard分布在12台64G的机器上.因为机器太多,查询相关的信息不太方便. ...
- NSArray和NSMutableArray的常用方法 (转)
NSArray和NSMutableArray的常用方法 (转) (2013-09-06 15:13:46) 标签: it 分类: ios编程 初始化方法: 1.init返回一个空数组 2.i ...