欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2014年09月02日 16:18:04   投稿:shichen2014  
這篇文章主要介紹了C++實現(xiàn)八皇后問題的方法,是數(shù)據(jù)結構與算法中常見的一個經(jī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++算法設計有所幫助。

相關文章

  • C語言平衡二叉樹真題練習

    C語言平衡二叉樹真題練習

    平衡二叉樹又被稱為AVL樹(有別于AVL算法),且具有以下性質(zhì):它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹。本文將詳解介紹一下平衡二叉樹的原理與實現(xiàn),需要的可以參考一下
    2022-04-04
  • 深入了解C語言冒泡排序優(yōu)解

    深入了解C語言冒泡排序優(yōu)解

    這篇文章主要介紹了C語言冒泡排序法的實現(xiàn)(升序排序法),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • C++下標運算符[]重載代碼示例

    C++下標運算符[]重載代碼示例

    這篇文章主要給大家介紹了關于C++下標運算符[]重載的相關資料,C++ 規(guī)定下標運算符[]必須以成員函數(shù)的形式進行重載,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • C++索引越界的解決方法

    C++索引越界的解決方法

    本文主要介紹了C++索引越界的解決方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語言簡明介紹常見關鍵字的用法

    C語言簡明介紹常見關鍵字的用法

    關鍵字是C語言非常重要的一部分,熟練的掌握和使用關鍵字有助于我們更加熟悉了解C語言,同時C語言的關鍵字也是面試筆試中常考的內(nèi)容。C語言的關鍵字共有32個,但并不是每個關鍵字都有坑,本篇文章將通過理論聯(lián)系實際的方式為大家講解C語言中易混易錯以及??嫉囊恍╆P鍵字
    2022-06-06
  • C語言詳細講解位運算符的使用

    C語言詳細講解位運算符的使用

    C語?既具有?級語?的特點,?具有低級語?的特性,如?持位運算就是其具體體現(xiàn)。這是因為,C語?最初是為取代匯編語?設計系統(tǒng)軟件?設計的,因此C語?必須?持位運算等匯編操作。位運算就是對字節(jié)或字內(nèi)的?進制數(shù)位進?測試、抽取、設置或移位等操作
    2022-04-04
  • 詳解C語言基礎的類型轉(zhuǎn)換

    詳解C語言基礎的類型轉(zhuǎn)換

    這篇文章主要為大家介紹了C語言基礎的類型轉(zhuǎn)換,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 從頭學習C語言之if語句的使用

    從頭學習C語言之if語句的使用

    這篇文章主要為大家詳細介紹了C語言之if語句的使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++ Thread實現(xiàn)簡單的socket多線程通信

    C++ Thread實現(xiàn)簡單的socket多線程通信

    本文主要介紹了C++ Thread實現(xiàn)簡單的socket多線程通信,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • C++ 中 socket編程實例詳解

    C++ 中 socket編程實例詳解

    這篇文章主要介紹了C++ 中 socket編程實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06

最新評論