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

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

 更新時(shí)間:2014年09月02日 16:18:04   投稿:shichen2014  
這篇文章主要介紹了C++實(shí)現(xiàn)八皇后問題的方法,是數(shù)據(jù)結(jié)構(gòu)與算法中常見的一個(gè)經(jīng)典算法,需要的朋友可以參考下

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

一般在八皇后問題中,我們要求解的是一個(gè)8*8的國(guó)際象棋棋盤中,放下8個(gè)皇后且互相不能攻擊的排列總數(shù)?;屎蟮墓舴秶鸀檎校?,以及其斜對(duì)角線。

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

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

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

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

 //八皇后問題的實(shí)現(xiàn)
#include <iostream>
#include <string>
using namespace std;
//QueenChess類聲明
class QueenChess
{
   public:
       QueenChess();     //構(gòu)造函數(shù)
       void Solve();     //求解八皇后問題,并給出放置成功的棋盤總個(gè)數(shù) 
   private:
       string chessState[8];     //用于存放棋盤狀態(tài)
       int solves;          //八個(gè)皇后放置成功的棋盤解的總個(gè)數(shù)
       bool SafeJudge(int row,int col) const;  //判斷位置(row,col)是否安全
       void PlaceQueen(int row);         //在第row行放置一個(gè)皇后
       void DrawChess() const;          //打印八個(gè)皇后放置成功的棋盤 
};

//構(gòu)造函數(shù),將棋盤初始化
QueenChess::QueenChess()
{
   solves=0;
   int i=0,j=0;
   for(;i<8;++i)
   chessState[i]="--------";
}

//求解八皇后問題,并給出放置成功的棋盤總個(gè)數(shù)
void QueenChess::Solve()
{
   //從第0行開始放置皇后
   PlaceQueen(0);
   cout<<"/n八皇后問題總共的解的個(gè)數(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)放置了八個(gè)皇后,打印出成功的棋盤,并將解數(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");
      //如果兩個(gè)皇后在同一行、同一列或兩條對(duì)角線上,則說明該位置不安全
      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<<" 個(gè)解為:"<<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
   //每打印一個(gè)成功的八皇后棋盤,暫停一下
   //system("pause"); 
}

//main函數(shù)進(jìn)行測(cè)試 
int main()
{
  QueenChess chess;
  chess.Solve();
  system("pause");
  return 0; 
}

希望本文所述實(shí)例對(duì)大家C++算法設(shè)計(jì)有所幫助。

相關(guān)文章

  • C語(yǔ)言平衡二叉樹真題練習(xí)

    C語(yǔ)言平衡二叉樹真題練習(xí)

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

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

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

    C++下標(biāo)運(yùn)算符[]重載代碼示例

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

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

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

    C語(yǔ)言簡(jiǎn)明介紹常見關(guān)鍵字的用法

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

    C語(yǔ)言詳細(xì)講解位運(yùn)算符的使用

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

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

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

    從頭學(xué)習(xí)C語(yǔ)言之if語(yǔ)句的使用

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

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

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

    C++ 中 socket編程實(shí)例詳解

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

最新評(píng)論