C++資料結構--回溯演算法--八皇后問題
阿新 • • 發佈:2019-01-06
*queensList為儲存所有皇后的向量陣列
*/
bool safeLocation(int row,int col,vector<int> &queensList)
{
int qRow,qCol;
for(qCol=0;qCol<col;qCol++) //從第0列遍歷到col-1列
{
qRow=queensList[qCol];//queensList[qCol]記錄著列下標為qCol的皇后的橫座標
if(row==qRow) //同行
return false;
if(row+col==qRow+qCol||row-col==qRow-qCol) //同對角線
return false;
}
return true;
}
//列印皇后資訊
void printQueens(vector<int> queensList)
{
static int cnt=0;
if((cnt++)%8==0)
cout<<endl;
for(int x:queensList)
cout<<(x+1);
cout<<ends;
}
//求8皇后問題的所有解
void allSolution(vector<int> queensList,int col)
{
if(col==8) //找到了一種可能的排列,輸出皇后列表資訊
printQueens(queensList);
else
{
int row=0; //從第0行開始
while(row<8)
{
if(safeLocation(row,col,queensList)) //找到安全位置
{
queensList[col]=row; //記錄座標
allSolution(queensList,col+1);//當遞迴開始返回時,說明找到了一種可能
row++; //從下一行開始繼續查詢另一種可能的排列
}
else //找不到安全位置
row++;//從下一行開始查詢安全位置
}
}
}
測試程式碼
int main()
{
vector<int > vec(8,0);
allSolution(vec,0);
return 0;
}
*/
bool safeLocation(int row,int col,vector<int> &queensList)
{
int qRow,qCol;
for(qCol=0;qCol<col;qCol++) //從第0列遍歷到col-1列
{
qRow=queensList[qCol];//queensList[qCol]記錄著列下標為qCol的皇后的橫座標
if(row==qRow) //同行
return false;
if(row+col==qRow+qCol||row-col==qRow-qCol) //同對角線
return false;
}
return true;
}
//列印皇后資訊
void printQueens(vector<int> queensList)
{
static int cnt=0;
if((cnt++)%8==0)
cout<<endl;
for(int x:queensList)
cout<<(x+1);
cout<<ends;
}
//求8皇后問題的所有解
void allSolution(vector<int> queensList,int col)
{
if(col==8) //找到了一種可能的排列,輸出皇后列表資訊
printQueens(queensList);
else
{
int row=0; //從第0行開始
while(row<8)
{
if(safeLocation(row,col,queensList)) //找到安全位置
{
queensList[col]=row; //記錄座標
allSolution(queensList,col+1);//當遞迴開始返回時,說明找到了一種可能
row++; //從下一行開始繼續查詢另一種可能的排列
}
else //找不到安全位置
row++;//從下一行開始查詢安全位置
}
}
}
測試程式碼
int main()
{
vector<int > vec(8,0);
allSolution(vec,0);
return 0;
}