您的位置:首页 > 其它

八皇后问题

2015-08-11 19:37 113 查看
先来一张图



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


对于八皇后的求解可采用深搜+回溯算法,从上至下依次在每一行放置皇后,进行搜索,若在某一行的任意一列放置皇后均不能满足要求,则不再向下搜索,而进行回溯,回溯至有其他列可放置皇后的一行,再向下搜索,直到搜索至最后一行,找到可行解,输出。

具体代码如下所示

[code]
 #include<iostream>
 #include <cstdio>
 #include <string.h>
 #include <math.h>
using namespace std;
int ans;
int col[11];
void dfs(int row)
{
    if (row == 8)
    {
        ans++;
        return ;
    }
    for (int i = 0; i < 8; i++)
    {
        col[row] = i;
        bool flag = true;
        for (int j = 0; j < row; j++)
        {
            if (col[j] == col[row] || col[j] + j == col[row] + row || col[j] - j == col[row] - row)
            {
                flag = false;
                break;
            }
        }
        if (flag)
        {
            dfs(row + 1);
        }
    }
}

int main()
{
    ans = 0;
    dfs(0);
    cout << ans << endl;
    return 0;
}

关于n皇后的解的个数(8皇后是92个解):

n       a(n)  
    1       1  
    2       0  
    3       0  
    4       2  
    5       10  
    6       4  
    7       40  
    8       92  
    9       352  
    10      724  
    11      2680  
    12      14200  
    13      73712  
    14      365596  
    15      2279184  
    16      14772512  
    17      95815104  
    18      666090624  
    19      4968057848  
    20      39029188884  
    21      314666222712  
    22      2691008701644  
    23      24233937684440  
    24      227514171973736  
    25      2207893435808352  
    26      22317699616364044
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: