国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 田阳县| 天等县| 怀集县| 贵南县| 南通市| 河津市| 梓潼县| 闵行区| 平顶山市| 紫云| 乐昌市| 潮州市| 铜川市| 城固县| 喀喇沁旗| 阳朔县| 镇巴县| 洛宁县| 尼勒克县| 巴里| 隆化县| 肇庆市| 加查县| 白城市| 绥宁县| 高州市| 邯郸县| 新竹县| 葫芦岛市| 西林县| 广安市| 腾冲县| 张家界市| 台前县| 怀远县| 阳春市| 通海县| 临夏市| 固原市| 河曲县| 洪泽县|