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皇后问题的更多相关文章

  1. 递归实现n(经典的8皇后问题)皇后的问题

    问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...

  2. 八皇后算法的另一种实现(c#版本)

    八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...

  3. [LeetCode] N-Queens II N皇后问题之二

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  4. [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 ...

  5. N皇后问题—初级回溯

    N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...

  6. 数据结构0103汉诺塔&八皇后

    主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...

  7. N皇后问题

    题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...

  8. 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 ...

  9. 八皇后问题_Qt_界面程序实现

    //核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...

随机推荐

  1. 郁闷的出纳员(bzoj 1503)

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...

  2. 洛谷——P3379 【模板】最近公共祖先(LCA)

    P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...

  3. mvn解决jar包冲突

    转自:http://blog.csdn.net/guanglihuan/article/details/50512855 对于Jar包冲突问题,我们开发人员经常都会有碰到,当我们使用一些jar包中的类 ...

  4. Connection节点配置错误解决方案

    问题:配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件.分析器错误信息: 无法识别的配置节“connectionStrings”源错误:行 ...

  5. MongoDB小结12 - update【多文档更新】

    当一次更新一个文档无法满足我们的脚步时,我们可以选择一次更新多个文档,及在update的第四个参数的位置添上true,及做多文档更新,建议就算不做多文档更新也显式的在第四个参数上置false,这样明确 ...

  6. Sql批量添加,批量查询,批量删除,批量修改。mybatis都有对应标签

    Sql批量添加,批量查询,批量删除,批量修改.mybatis都有对应标签

  7. 又见古老的Typosquatting攻击:这次入侵Npm窃取开发者身份凭证

    有些攻击方式虽然听起来很幼稚,但有时候却也可以生效,比如typosquatting攻击——我们上次看到这种攻击是在去年6月份,这本身也是种很古老的攻击方式. 所谓的typosquatting,主要是通 ...

  8. iOS音频播放 (二):AudioSession 转

    原文出处 :http://msching.github.io/blog/2014/07/08/audio-in-ios-2/ 前言 本篇为<iOS音频播放>系列的第二篇. 在实施前一篇中所 ...

  9. rsh 无秘钥登陆配置

    /etc/hosts.equiv里的主机不须要提供password就能够訪问本机./etc/host.equiv 要和~/.rhosts文件连用. [root@web-htl2-01 ~]# cat ...

  10. lambda和委托那点事

    Lambda 简介 Lambda 表达式是一种可用于创建委托或表达式目录树类型的一种匿名函数(匿名方法+Lambda).通过使用 lambda 表达式,可以写入可作为参数传递或作为函数 调用值返回的本 ...