八皇后問題c++程式碼遞歸回溯例項及執行結果
阿新 • • 發佈:2019-02-19
八皇后問題,是一個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於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; }
執行結果