美文网首页
八皇后问题

八皇后问题

作者: IT孤独者 | 来源:发表于2017-01-10 18:42 被阅读0次

题目:八皇后问题
思路:就用回溯法。
这个算法类似动态规划的思想。

代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 八皇后问题
// 回溯法的典型代表,初学计算机的时候,这个算法算是比较难的了,现在看来真是一般的计算问题。

int g_nCount;
struct coordinate
{
    int x;
    int y;

    coordinate(int n1, int n2) : x(n1), y(n2) {}
};

void PrintXYSeq(coordinate xy)
{
    cout << "[" << xy.x << "," << xy.y << "]" << " ";
}

bool CheckXY(vector<vector<int> > & vecMatrix, int row, int col)
{
    return vecMatrix[row][col] == 0;
}

void ModifyXY(vector<vector<int> > & vecMatrix, int row, int col, int nLen, bool bFlag)
{
    int base = 1;
    if (bFlag)  base = 1;
    else base = -1;
    for (int i=0; i<nLen; ++i) {
        vecMatrix[row][i] += base;
    }

    for (int i=0; i<nLen; ++i) {
        vecMatrix[i][col] += base;
    }

    for (int i=row,j=col; i>=0 && j>=0; --i, --j) {
        vecMatrix[i][j] += base;        
    }
    for (int i=row,j=col; i>=0 && j<nLen; --i, ++j) {
        vecMatrix[i][j] += base;        
    }
    for (int i=row,j=col; i<nLen && j<nLen; ++i, ++j) {
        vecMatrix[i][j] += base;        
    }
    for (int i=row,j=col; i<nLen && j>=0; ++i, --j) {
        vecMatrix[i][j] += base;        
    }
}

void GenerateSeq(vector<coordinate> & vecSeq, int row, int col, int nLen, vector<vector<int> > & vecMatrix)
{
    if (row == nLen) {
        for_each(vecSeq.begin(), vecSeq.end(), PrintXYSeq);
        cout << endl;
        ++g_nCount;
        return ;
    }

    for (int i=col; i<nLen; ++i) {
        if (CheckXY(vecMatrix, row, i)) {
            ModifyXY(vecMatrix, row, i, nLen, true);
            vecSeq.push_back(coordinate(row, i));
            GenerateSeq(vecSeq, row+1, 0, nLen, vecMatrix);
            vecSeq.pop_back();
            ModifyXY(vecMatrix, row, i, nLen, false);
        }
    }
}

void Output()
{
    const int nLen = 8;
    vector<vector<int> > vecMatrix(nLen, vector<int>(nLen, 0));
    vector<coordinate> vecSeq;

    GenerateSeq(vecSeq, 0, 0, nLen, vecMatrix);

}

int main(int argc, char ** argv)
{
    Output();
    cout << g_nCount << endl;
    return 0;
}

上面我使用的方法应该是算快的了,给个效率更高的八皇后问题

相关文章

  • 11.数据结构—八皇后问题(回溯法)

    11.1 八皇后问题 八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 88 的棋盘中放...

  • 算法(03)回溯

    八皇后问题

  • 八皇后问题(N皇后问题)

    八皇后问题是一个经典的递归回溯问题。 描述 八皇后问题是在一个 8*8 的棋盘上放置皇后,要求其放置后满足同一行,...

  • 八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在...

  • 八皇后问题

    问题的类别是回溯(backtrace). 回溯通常用递归实现。回溯中注意边界问题,避免越界。同时,剪枝可以减少ca...

  • 八皇后问题

    课堂上老师讲了广度优先搜索算法后让课下实现下八皇后问题,就突发奇想了很多实现方法,这里只把我的实现方式和实现代码粘...

  • 八皇后问题

    问题 八皇后问题是一个古老而著名的问题,是试探法的典型例题。该问题由19世纪数学家高斯1850年手工解决。原题为在...

  • 八皇后问题

    采用试探回溯策略,通过栈记录查找结果,实现八皇后问题求解。 测试代码

  • 八皇后问题

    如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任两个皇后都不能处于同一条横行、纵行或斜线上。 先从第一列开...

  • 八皇后问题

    问题描述: 在8x8的网格上,放置皇后两个皇后,两个皇后之间不能在同一行,也不能在同一列,也不能在对角线上。 cl...

网友评论

      本文标题:八皇后问题

      本文链接:https://www.haomeiwen.com/subject/tnqlbttx.html