C++實現(xiàn)八皇后問題的方法
本文實例展示了C++實現(xiàn)八皇后問題的方法,是數(shù)據(jù)結(jié)構(gòu)與算法中非常經(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(); //構(gòu)造函數(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; //打印八個皇后放置成功的棋盤
};
//構(gòu)造函數(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ù)進(jìn)行測試
int main()
{
QueenChess chess;
chess.Solve();
system("pause");
return 0;
}
希望本文所述實例對大家C++算法設(shè)計有所幫助。
相關(guān)文章
C++ Thread實現(xiàn)簡單的socket多線程通信
本文主要介紹了C++ Thread實現(xiàn)簡單的socket多線程通信,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

