八皇后問(wèn)題

題目:八皇后問(wèn)題
思路:就用回溯法。
這個(gè)算法類似動(dòng)態(tài)規(guī)劃的思想。

代碼如下:

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

// 八皇后問(wèn)題
// 回溯法的典型代表,初學(xué)計(jì)算機(jī)的時(shí)候,這個(gè)算法算是比較難的了,現(xiàn)在看來(lái)真是一般的計(jì)算問(wèn)題。

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;
}

上面我使用的方法應(yīng)該是算快的了,給個(gè)效率更高的八皇后問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 八皇后問(wèn)題問(wèn)題描述:八皇后問(wèn)題,是一個(gè)古老而著名的問(wèn)題,是回溯算法的典型案例。該問(wèn)題是國(guó)際西洋棋棋手馬克斯·貝瑟爾...
    藥藥耀耀閱讀 2,181評(píng)論 0 0
  • 八皇后問(wèn)題:在8*8的棋盤(pán)上放置8個(gè)皇后,保證任意兩個(gè)皇后之間不能相互攻擊。(即沒(méi)有兩個(gè)皇后是在同一行、同一類、或...
    五秋木閱讀 853評(píng)論 0 0
  • 問(wèn)題描述: 八皇后問(wèn)題,是一個(gè)古老而著名的問(wèn)題,是回溯算法的典型案例:在8X8格的國(guó)際象棋棋盤(pán)上擺放八個(gè)皇后,使其...
    HeartGo閱讀 431評(píng)論 0 3
  • 八皇后問(wèn)題,是一個(gè)古老而著名的問(wèn)題,是回溯算法的典型案例。該問(wèn)題是國(guó)際西洋棋棋手馬克斯·貝瑟爾于1848年提出:在...
    極速魔法閱讀 2,223評(píng)論 0 0
  • 在討論完唐宋繪畫(huà)茶事后,我們來(lái)看兩幅明代的畫(huà)作,唐寅的《事茗圖》和文徵明的《惠山茶會(huì)圖》。 (一) 我們知道,茶的...
    小鼴鼠的洞閱讀 1,520評(píng)論 0 6

友情鏈接更多精彩內(nèi)容