1. 程式人生 > >八皇后問題c++程式碼遞歸回溯例項及執行結果

八皇后問題c++程式碼遞歸回溯例項及執行結果

八皇后問題,是一個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法

具體分析可見程式設計師面試寶典

c++程式碼

#include <iostream>

using namespace std;

static char eightQueen[8][8];//8*8的佈局
static int columnConflict[8];//標記列衝突
static int mainDiagonalLine[15];//標記主對角線衝突
static int counterDiagonalLine[15];//標記副對角線衝突
static int eightQueenNum=0;//標記一共多少種擺法

void rowNum(int i)//i表示行數
{
    int iColumn;
    for(iColumn=0;iColumn<8;iColumn++)
    {
        //如果無衝突
        if(columnConflict[iColumn]==0&&mainDiagonalLine[i-iColumn+7]==0&&counterDiagonalLine[i+iColumn]==0)
        {
            eightQueen[i][iColumn]='*';//放皇后
            columnConflict[iColumn]=1;//下一次該列上不能放皇后
            mainDiagonalLine[i-iColumn+7]=1;//下一次該主對角線不能放皇后
            counterDiagonalLine[i+iColumn]=1;//下一次該副對角線不能放皇后
            if(i<7)
                rowNum(i+1);//遞迴遍歷
            else
            {//列印
                int iRow,iColumn;
                cout<<"第"<<++eightQueenNum<<"種狀態為"<<endl;
                for(iRow=0;iRow<8;iRow++)
                {
                    for(iColumn=0;iColumn<8;iColumn++)
                        cout<<eightQueen[iRow][iColumn];
                    cout<<endl;
                }
                cout<<endl;
            }
            //前面皇后放置位置導致後面無論怎樣都不能滿足要求,則回溯
            eightQueen[i][iColumn]='-';
            columnConflict[iColumn]=0;
            mainDiagonalLine[i-iColumn+7]=0;
            counterDiagonalLine[i+iColumn]=0;
        }
    }
}

int main()
{
    int iRow,iColumn;
    //初始化
    for(iRow=0;iRow<8;iRow++)
    {
        columnConflict[iRow]=0;
        for(iColumn=0;iColumn<8;iColumn++)
            eightQueen[iRow][iColumn]='-';
    }
    for(iRow=0;iRow<15;iRow++)
        mainDiagonalLine[iRow]=counterDiagonalLine[iRow]=0;
    rowNum(0);
    cout<<"一共有"<<eightQueenNum<<"種擺法";
    return 0;
}


執行結果