国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++如何實現(xiàn)八皇后問題的方

2020-02-24 14:31:04
字體:
來源:轉載
供稿:網(wǎng)友

本文實例展示了C++實現(xiàn)八皇后問題的方法,是數(shù)據(jù)結構與算法中非常經(jīng)典的一個算法。分享給大家供大家參考之用。具體方法如下:

一般在八皇后問題中,我們要求解的是一個8*8的國際象棋棋盤中,放下8個皇后且互相不能攻擊的排列總數(shù)。皇后的攻擊范圍為整行,整列,以及其斜對角線。

由于皇后的攻擊范圍特性,注定我們每行只能放下一個皇后,于是我們要做的只是逐行放下皇后。八皇后問題是回溯法的典型問題。這里我們用的方法很簡單:

從第一行開始逐個檢索安全位置擺放皇后,一旦有安全位置則考慮下一行的安全位置。如果發(fā)現(xiàn)某行沒有安全位置,則返回上一行繼續(xù)檢索安全位置;如果發(fā)現(xiàn)在最后一行找到了安全位置則輸出整個棋盤。

原理很簡單,整個程序中表現(xiàn)了這個思想的函數(shù)是void Solve()

下面是實現(xiàn)的代碼:

?

 //八皇后問題的實現(xiàn)#include <iostream>#include <string>using namespace std;//QueenChess類聲明class QueenChess{   public:       QueenChess();     //構造函數(shù)       void Solve();     //求解八皇后問題,并給出放置成功的棋盤總個數(shù)    private:       string chessState[8];     //用于存放棋盤狀態(tài)       int solves;          //八個皇后放置成功的棋盤解的總個數(shù)       bool SafeJudge(int row,int col) const;  //判斷位置(row,col)是否安全       void PlaceQueen(int row);         //在第row行放置一個皇后       void DrawChess() const;          //打印八個皇后放置成功的棋盤 };//構造函數(shù),將棋盤初始化QueenChess::QueenChess(){   solves=0;   int i=0,j=0;   for(;i<8;++i)   chessState[i]="--------";}//求解八皇后問題,并給出放置成功的棋盤總個數(shù)void QueenChess::Solve(){   //從第0行開始放置皇后   PlaceQueen(0);   cout<<"/n八皇后問題總共的解的個數(shù)是:"<<solves<<endl; }//在第row行的各列放置皇后void QueenChess::PlaceQueen(int row){   //窮盡第row行的所有列   for(int col=0;col<8;col++)   {       if(SafeJudge(row,col))       {           //位置(row,col)安全,則放一皇后            chessState[row][col]='Q';           //若還沒有放到第八行,則嘗試下一行           if(row<7)            PlaceQueen(row+1);           //已經(jīng)放置了八個皇后,打印出成功的棋盤,并將解數(shù)加1           else           {             solves++;             DrawChess();           }        }//end if       //不安全,將該處的皇后拿走,嘗試下一列位置       chessState[row]="--------";    } }//判斷是否(row,col)是安全位置bool QueenChess::SafeJudge(int row,int col) const{   int qRow,qCol;   //檢查前面各行,看與前面的皇后是否發(fā)生攻擊   for(qRow=0;qRow<row;qRow++)   {      string rowState=chessState[qRow];      //尋找第qRow行放置皇后的列數(shù)      qCol=rowState.find("Q");      //如果兩個皇后在同一行、同一列或兩條對角線上,則說明該位置不安全      if(qRow==row||qCol==col||(qCol-qRow)==(col-row)||(qCol+qRow)==(col+row))         return false;    } //end if   return true;}//打印成功的棋盤void QueenChess::DrawChess() const{   int i,j;   cout<<"/n八皇后問題的第"<<solves<<" 個解為:"<<endl;   cout<<" 0 1 2 3 4 5 6 7"<<endl;   for(i=0;i<8;++i)   {      cout<<i<<" ";      for(j=0;j<8;++j)      cout<<chessState[i][j]<<" ";      cout<<endl;   } //end for   //每打印一個成功的八皇后棋盤,暫停一下   //system("pause"); }//main函數(shù)進行測試 int main(){  QueenChess chess;  chess.Solve();  system("pause");  return 0; }

這篇文章主要介紹了C++實現(xiàn)八皇后問題的方法,是數(shù)據(jù)結構與算法中常見的一個經(jīng)典算法,希望本文所述實例對大家C++算法設計有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武川县| 乐至县| 咸宁市| 石渠县| 澳门| 遵化市| 潮安县| 栖霞市| 舒兰市| 盐城市| 广元市| 婺源县| 仙游县| 贺兰县| 孝义市| 东丽区| 台南市| 旌德县| 怀远县| 布尔津县| 阿勒泰市| 弥勒县| 乌审旗| 寿宁县| 武平县| 唐山市| 衡山县| 文水县| 霍邱县| 贵溪市| 石首市| 革吉县| 尉氏县| 那曲县| 台东县| 深圳市| 郓城县| 锡林郭勒盟| 昌江| 淳安县| 凉城县|