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. Quartz.net框架使用

    概述:Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...

  2. 【NOIP2017练习】溢出(模拟)

    题意: 思路: a*b<=c <====> b<=c div a var ch,maxs,s:ansistring; v,k,i,maxl,l,len,cnt,cas:long ...

  3. 单调队列&单调栈 基础

    参考博客https://www.cnblogs.com/tham/p/8038828.html 例题  poj 2823 Sliding Window Time Limit: 12000MS   Me ...

  4. linux 实现VLAN

    本文将在一台linux机器上,利用linuxbridge 等技术模拟创建VLAN 环境. 首先,创建vlan interface ip link add link ens33 name ens33.8 ...

  5. SVG :可缩放矢量图形(Scalable Vector Graphics)。

    SVG 意为可缩放矢量图形(Scalable Vector Graphics). SVG 使用 XML 格式定义图像. SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失 SVG 使用 XML ...

  6. hibernate之多对一单向关联

    一个工作组(Group)里能够有多个用户(User),一个User仅仅属于一个Group,这是典型的多对一的关系. 在多对一的关系中正确的数据库设计是在多的这方(在这里是User这方)加一个Group ...

  7. MapReduce Cross 示例

    MapReduce Cross 示例 package com.bsr.cross; import java.io.IOException; import org.apache.hadoop.conf. ...

  8. [AngularJS 1.6] ngModelOptions and inheritance

    Problem with ngModleOptions before 1.6: <input type="text" name="fullname" ng ...

  9. C# 控制台程序如何输出Messagebox

    1 添加如下引用   2 添加引用和Messagebox的代码.   3 测试可行                

  10. Tomcat启动一半闪退问题解决

    近期刚刚接触Tomcat.对其还不是非常了解. 在这几天,遇到一个Tomcat启动闪退的问题.通过查阅各种资料.算是完美解决.在此分享给朋友们. 首先.确定你的问题在哪里.有两个方法,你能够通过日志去 ...