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

分析:
  我们可以用一串数字来表示问题的解,比如[2,4,1,3] 表示 4×4 棋盘的4皇后问题的解,第一行的棋子摆在第2列;第二行的棋子摆在第4列,依此类推
  这里将用回溯法进行解题,可以看出,某一行的棋子摆了之后,棋子的那一列肯定不能再摆其他的棋子了,

  所以解[x,x,x,……,x] 一定是 1-n 的一个全排列,

  所以这里的解空间树我们选择排列树。

思路:
  既然已经确定了要用排列树来作为问题的解空间树,接下来要确定的就是剪枝函数了。

  剪枝函数只要从已经摆好的棋子的第一个开始遍历,依此判断下面的棋子是否在其攻击范围内即可,

  因为我们之前没有在同一行摆多个棋子,也没有在同一列摆多个棋子,所以只要判断其他棋子是否在其斜线上的攻击范围即可,比如

      

  第一行的棋子摆在第3列上,只要沿图中方向判断即可

    

for (int i = ; i <= n-; i++)
{
for (int j = i + ; j <= n; j++)
{
int left = -(j - i);//向左的斜线
int right = (j - i);//向右的斜线
if (pieces[j] == pieces[i] + left||pieces[j] == pieces[i] + right)
{//第i行皇后和第j行皇后会互相攻击
return false;
}
}
}

代码:

  这样摆好所有棋子后即可输出,代码如下:

  

#include<iostream>
#include<ctime>
using namespace std; bool isOK(int n, int pieces[])
{ //剪枝函数
//判断当前状态是否合理,即皇后会不会互相攻击
for (int i = ; i <= n-; i++)
{
for (int j = i + ; j <= n; j++)
{
int left = -(j - i);//向左的斜线
int right = (j - i);//向右的斜线
if (pieces[j] == pieces[i] + left||pieces[j] == pieces[i] + right)
{//第i行皇后和第j行皇后会互相攻击
return false;
}
}
}
//所有皇后都不会互相攻击
return true;
} void swap(int &a, int &b)
{
int t = a;
a = b;
b = t;
} void nQueen(int n, int t, int pieces[])
{
if (t > n)
{
for (int i = ; i <= n; i++)
{
for (int j = ; j < pieces[i]; j++)
cout << "- ";
cout << pieces[i]<<" ";
for (int j = pieces[i] + ; j <= n; j++)
cout << "- ";
cout << endl;
}
cout << endl;
}
else
{
for (int i = t; i <= n; i++)
{
swap(pieces[t], pieces[i]);
if (isOK(t, pieces))
{
nQueen(n, t + , pieces);
}
swap(pieces[t], pieces[i]);
}
}
} void main()
{
int n;
cin >> n;
int *pieces = new int[n + ];
for (int i = ; i <= n; i++)
{
pieces[i] = i;
}
nQueen(n, , pieces);
cout << "OK" << endl;
system("pause");
}

n皇后问题[分支限界法]的更多相关文章

  1. ytu 1789:n皇后问题(水题,枚举)

    n皇后问题 Time Limit: 1 Sec  Memory Limit: 64 MB  Special JudgeSubmit: 12  Solved: 3[Submit][Status][Web ...

  2. 1319-n皇后问题

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

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

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

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

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

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

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

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

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

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

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

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

  9. N皇后问题

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

随机推荐

  1. cogs p服务点设置

    5. P服务点设置 ★★   输入文件:djsc.in   输出文件:djsc.out   简单对比时间限制:2 s   内存限制:128 MB 问题描述为了进一步普及九年义务教育,政府要在某乡镇建立 ...

  2. SD 一轮集训 day3 染色(color)

    蜜汁打表题.. (首先L=1和L=N的情况过于傻逼(而且是特殊情况),可以先写出来,然后剩下的L的做法在下面) 首先你要写一个打表程序,找出{1,2,....,n} 乘若干个 循环唯一的轮换可以搞出的 ...

  3. small test on 5.30 morning T3

    经典的等价类计数问题,我们设 f(x) 为环长为 x 的时候的花环种类,那么答案显然等于 1/n  *  Σf( gcd (i,n) * [gcd(i,n)!=1] * [i>=0&&a ...

  4. 【动态规划】bzoj1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典

    f[i]=min{f[i+1]+1,f[i+len[j]+cant]+cant}(for i=L-1 downto 0)(1<=j<=w) #include<cstdio> # ...

  5. 【最近公共祖先】【树链剖分】CODEVS 1036 商务旅行

    树链剖分求lca模板.O(log(n)),就是不倍增嘛~ #include<cstdio> #include<algorithm> using namespace std; # ...

  6. hadoop中URI理解

    1)在编写MR程序的时候经常会有如下代码: String uri=“....”: Configuration conf=new Configuration(): FileSystem fs=FileS ...

  7. P2P通信标准协议(四)之SIP

    在前面几篇文章中我们介绍了建立p2p通信的一般协议(簇),以及一种完整的NAT传输解决方案ICE, 但是对于多用户的通信情况,还有一些通用协议来实现标准化的管理,如之前讲过的SDP和SIP等,SIP( ...

  8. 【jQuery】:not选择器的说明和:checked选择器的使用

    1.:not选择器的说明使用 先给出一下例子: $(".form1 :not(input[name='category'])") 这个 能实现 获取到from1表单中除了input ...

  9. [Android Memory] Android 的 StrictMode

    android的2.3 之后引入的StrictMode 对网络的访问做了限制啊. public void onCreate() { if (DEVELOPER_MODE) { StrictMode.s ...

  10. rundll32.exe的相关使用语句

    命令列: rundll32.exe shell32.dll,Control_RunDLL 功能: 显示控制面板 命令列: rundll32.exe shell32.dll,Control_RunDLL ...