最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

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

//求解八皇后問(wèn)題,并給出放置成功的棋盤(pán)總個(gè)數(shù)
void QueenChess::Solve()
{
   //從第0行開(kāi)始放置皇后
   PlaceQueen(0);
   cout<<"/n八皇后問(wè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';
           //若還沒(méi)有放到第八行,則嘗試下一行
           if(row<7)
            PlaceQueen(row+1);
           //已經(jīng)放置了八個(gè)皇后,打印出成功的棋盤(pán),并將解數(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ì)角線(xiàn)上,則說(shuō)明該位置不安全
      if(qRow==row||qCol==col||(qCol-qRow)==(col-row)||(qCol+qRow)==(col+row))  
       return false; 
   } //end if
   return true;
}

//打印成功的棋盤(pán)
void QueenChess::DrawChess() const
{
   int i,j;
   cout<<"/n八皇后問(wè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è)成功的八皇后棋盤(pán),暫停一下
   //system("pause"); 
}

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

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

相關(guān)文章

  • OpenCV實(shí)現(xiàn)鼠標(biāo)在圖像上框選單目標(biāo)和多目標(biāo)

    OpenCV實(shí)現(xiàn)鼠標(biāo)在圖像上框選單目標(biāo)和多目標(biāo)

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)鼠標(biāo)在圖像上框選單目標(biāo)和多目標(biāo),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • C++命名空間實(shí)例解析

    C++命名空間實(shí)例解析

    這篇文章主要介紹了C++命名空間實(shí)例解析,對(duì)C++程序員來(lái)說(shuō)是非常重要的知識(shí)點(diǎn),需要的朋友可以參考下
    2014-08-08
  • C++20中的協(xié)程(Coroutine)的實(shí)現(xiàn)

    C++20中的協(xié)程(Coroutine)的實(shí)現(xiàn)

    這篇文章主要介紹了C++20中的協(xié)程(Coroutine)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 解析C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體

    解析C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體

    這篇文章主要介紹了C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • C語(yǔ)言實(shí)現(xiàn)計(jì)算器的兩種方法

    C語(yǔ)言實(shí)現(xiàn)計(jì)算器的兩種方法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)計(jì)算器的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語(yǔ)言實(shí)現(xiàn)二叉樹(shù)遍歷的迭代算法

    C語(yǔ)言實(shí)現(xiàn)二叉樹(shù)遍歷的迭代算法

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)二叉樹(shù)遍歷的迭代算法,包括二叉樹(shù)的中序遍歷、先序遍歷及后序遍歷等,是非常經(jīng)典的算法,需要的朋友可以參考下
    2014-09-09
  • C++引用和指針的區(qū)別你知道嗎

    C++引用和指針的區(qū)別你知道嗎

    這篇文章主要為大家介紹了C++引用和指針的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>
    2022-01-01
  • 詳解C語(yǔ)言編程之thread多線(xiàn)程

    詳解C語(yǔ)言編程之thread多線(xiàn)程

    這篇文章主要為大家介紹了C語(yǔ)言編程之thread多線(xiàn)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解上篇

    C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解上篇

    使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類(lèi)型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類(lèi)型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2022-04-04
  • C++實(shí)現(xiàn)圖書(shū)館案例

    C++實(shí)現(xiàn)圖書(shū)館案例

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書(shū)館案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論

磐石市| 丘北县| 尼玛县| 兴安盟| 沈阳市| 平和县| 越西县| 德令哈市| 兴业县| 白河县| 天峨县| 淄博市| 手游| 泸州市| 天峨县| 崇文区| 梁山县| 德惠市| 兴安县| 城步| 河北区| 嘉禾县| 达孜县| 邢台县| 东乌珠穆沁旗| 固安县| 通州区| 手游| 崇礼县| 温宿县| 白水县| 大荔县| 林芝县| 定西市| 开远市| 香格里拉县| 宜春市| 香格里拉县| 南部县| 乐业县| 湛江市|