1. 程式人生 > >C++資料結構--回溯演算法--八皇后問題

C++資料結構--回溯演算法--八皇后問題

 *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;
}