欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語言|點(diǎn)擊: 次

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

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

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

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

原理很簡單,整個(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è)皇后在同一行、同一列或兩條對角線上,則說明該位置不安全
      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)行測試 
int main()
{
  QueenChess chess;
  chess.Solve();
  system("pause");
  return 0; 
}

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

上一篇:C/C++中extern &quot;C&quot; 的作用分析

欄    目:C語言

下一篇:C++指向函數(shù)的指針用法詳解

本文標(biāo)題:C++實(shí)現(xiàn)八皇后問題的方法

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3425.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有