8皇后问题的各种解法

总体上分为回溯和全排列

全排列(递归)

 1 #include <iostream>
 2 #include <algorithm>
 3
 4 using namespace std;
 5
 6 template <size_t N> struct ArraySizeHelper { char _[N]; };
 7 template <typename T, size_t N> ArraySizeHelper<N> makeArraySizeHelper(T(&)[N]);
 8 #define ARRAY_SIZE(a) sizeof(makeArraySizeHelper(a))
 9
10 bool valid_permutation(const int *queen, int len)
11 {
12     bool valid = true;
13
14     for (int i = 0; i < len; ++i)
15     {
16         for (int j = i + 1; j < len; ++j)
17         {
18             if (queen[j] - queen[i] == j - i || queen[j] - queen[i] == i - j)
19             {
20                 valid = false;
21             }
22         }
23     }
24
25     return valid;
26 }
27
28 void permutation(int *queen, int len, int idx, int &count)
29 {
30     if (idx == len)
31     {
32         if (valid_permutation(queen, len)) ++count;
33     }
34     else
35     {
36         for (int i = idx; i < len; ++i)
37         {
38             swap(queen[i], queen[idx]);
39             permutation(queen, len, idx + 1, count);
40             swap(queen[i], queen[idx]);
41         }
42     }
43 }
44
45 // Solved by permutation recursion.
46 int eightqueen_permutation_recur()
47 {
48     int queen[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
49     int count = 0;
50
51     permutation(queen, (int)ARRAY_SIZE(queen), 0, count);
52
53     return count;
54 }
55
56 int main()
57 {
58     cout << eightqueen_permutation_recur() << endl;
59
60     system("pause");
61     return 0;
62 }

回溯(递归)

#include <iostream>
#include <algorithm>

using namespace std;

template <size_t N> struct ArraySizeHelper { char _[N]; };
template <typename T, size_t N> ArraySizeHelper<N> makeArraySizeHelper(T(&)[N]);
#define ARRAY_SIZE(a) sizeof(makeArraySizeHelper(a))

bool valid_backtracking(const int *queen, int len)
{
    for (int i = 0; i < len; ++i)
    {
        const int diff = abs(queen[i] - queen[len]);
        if (diff == 0 || diff == len - i) return false;
    }

    return true;
}

void placequeen(int *queen, int len, int idx, int &count)
{
    if (idx == len)
    {
        ++count;
    }
    else
    {
        for (int i = 0; i < len; ++i)
        {
            queen[idx] = i;

            if (valid_backtracking(queen, idx))
            {
                placequeen(queen, len, idx + 1, count);
            }
        }
    }
}

// Solved by backtracking(DFS) recursion.
int eightqueen_backtracking_recur()
{
    int queen[8];
    int count = 0;

    placequeen(queen, (int)ARRAY_SIZE(queen), 0, count);

    return count;
}

int main()
{
    cout << eightqueen_backtracking_recur() << endl;

    system("pause");
    return 0;
}

参考:http://www.cnblogs.com/codingmylife/archive/2012/10/04/2711839.html

时间: 2024-10-05 02:50:17

8皇后问题的各种解法的相关文章

C#中八皇后问题的递归解法——N皇后

百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections.Generic; namespace QueensSolution { class Program { static int count = 0; static void Main(string[] args) { int n = Int32.Parse(Console.ReadLine()); L

The Sultan&#39;s Successors UVA 167(八皇后问题)

说说: 其实这道题本质上就是一个八皇后问题.唯一的区别就是每个棋盘的格子都对应一个数字.最后要求输出,对应的解占据的格子的和的最大值.这只要在最后求出解的时候统计一下就可以了.下面就简单的说说八皇后问题,其实解法也不难.因为要求每行每列都要有棋子.因此只要确定每一行对应的棋子的列数就可以了.而对于每个棋子的所放的位置,同列上和对角线上不能有其他棋子,这个只要设一个访问数组保存一下就可以了.(注意要记得回溯).至于对角线的表示方法,例如所在位置为(x,y),那么一条对角线可以用x+y表示,另一条对

八皇后以及N皇后问题分析

八皇后是一个经典问题,在8*8的棋盘上放置8个皇后,每一行不能互相攻击. 因此 拓展出 N皇后问题. 下面慢慢了解解决这些问题的方法: 回溯法: 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法. 回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试. 在现实中,有很多问题往往需要我们把其所有可能穷举出来,然后从中找出满足某种要求的可能或最优的情况,从而得到整个问题的解. 回溯算法就是解决这种问题的“通用算法”,有“万能算法”之称. N皇后问题在N增大时就是这样一个解

[算法] N 皇后

N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试. 在现实中,有很多问题往往需要我们把其所有可能穷举出来,然后从中找出满足某种要求的可能或最优的情况,从而得到整个问题的解.回溯算法就是解决这种问题的“通用算法”,有“万能算法

递归之回朔算法应用----八皇后问题

从前,有个皇帝,取了八个皇后,由此产生一系列乱七八糟的问题,八皇后问题由此产生.哈哈 开个玩笑~~~~ 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.计算机发明后,有多种方法可以解决此问题.

桐桐的数学游戏(N皇后)

题目描述 相信大家都听过经典的“八皇后”问题吧?这个游戏要求在一个8×8的棋盘上放置8个皇后,使8个皇后互相不攻击(攻击的含义是有两个皇后在同一行或同一列或同一对角线上). 桐桐对这个游戏很感兴趣,也很快解决了这个问题.可是,他想为自己增加一点难度,于是他想求出n皇后的解的情况. 你能帮助她吗? 输入输出格式 输入格式: 一行,仅有一个数n(1≤n≤14),表示为n皇后问题. 输出格式: 输出仅有一个数,表示n皇后时问题的解法总数. 输入输出样例 输入样例: 8 输出样例: 92思路:从第一行开

【题解】N皇后问题

题目描述 相信大家都听过经典的"八皇后"问题吧?这个游戏要求在一个8×8的棋盘上放置8个皇后,使8个皇后互相不攻击(攻击的含义是有两个皇后在同一行或同一列或同一对角线上). 桐桐对这个游戏很感兴趣,也很快解决了这个问题.可是,他想为自己增加一点难度,于是他想求出n皇后的解的情况. 你能帮助她吗? 输入输出格式 输入格式: 一行,仅有一个数n(1≤n≤14),表示为n皇后问题. 输出格式: 输出仅有一个数,表示n皇后时问题的解法总数. 输入输出样例 输入样例: 8 输出样例: 92 这道

八皇后问题的两个高效的算法(回溯与递归)

序言 八皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 求解八皇后问题是算法中回溯法应用的一个经典案例 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试. 在现实中,有很多问题往往需要我们把其所有可能穷举出来,然后从中找出满足某种要求的可能或最优的情况,从而得到整个问题的解.回溯算法就是解决这种问题的“通用算法”,有“万能算法

第45课 递归的思想与应用(下)

1. 函数调用栈的回顾 (1)用于保存函数中的实参.局部变量.临时变量等. (2)从起始地址开始往一个方向增长(如:高地址→低地址) (3)有一个专用"指针"标识当前已使用内存的"顶部" (4)当函数调用结束时,栈会恢复到被调用前的状态.可以利用这个时机进行一些的回溯算法的设计. [实例分析]函数调用栈分析:逆序打印单链表中的偶数结点(void r_print_even(Node* list)),见本课后面的源码 2. 回溯求解八皇后问题 (1)回溯算法:实际上一个