用deque模擬棧解決八皇后問題

因爲棧stack的遍歷只能逐個pop,很麻煩,並且破壞了原來的棧,所以可以用deque來模擬棧。

 

  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. #include <deque>  
  4. #include <vector>  
  5. using namespace std;  
  6.  
  7. const int StackSize=8;                                               //定義棧的最大高度  
  8. int ans=0;                                                           //初始化擺放方案計數器  
  9.  
  10. template <class T>  
  11. bool Judgement(deque <T > Stack)  
  12. {  
  13.     T topdata=Stack.back();  
  14.     for(int i=0;i<Stack.size()-1;i++)                                           //依次檢查前面各行的皇后位置  
  15.         if(topdata==Stack[i]||(abs(topdata-Stack[i]))==(Stack.size()-1-i))    //判斷是否在同一列同一斜線  
  16.             return false;  
  17.     return true;  
  18. }  
  19.  
  20. template <class T>  
  21. void Output(deque <T > Stack)                                          //將棧的數組形式打印成棋盤形式  
  22. {  
  23.     cout<<"NO."<<ans<<":"<<endl;                                      
  24.     for(int i=0;i<StackSize;i++)  
  25.     {  
  26.         for(int j=0;j<Stack[i];j++)  
  27.             cout<<"- ";                                             //不放置處打印“-”  
  28.         cout<<"Q";                                                  //放置處打印“Q”  
  29.         for(int j=StackSize-1;j>Stack[i];j--)  
  30.             cout<<" -";  
  31.         cout<<endl;                                                 //換行  
  32.     }  
  33.     cout<<endl;  
  34. }  
  35. template <class T>  
  36. void PlaceQueen(int row,deque <T > Stack)                                //在棧頂放置符合條件的值的操作,即擺放皇后  
  37. {  
  38.     for (int col=0;col<StackSize;col++)                              //窮盡0~7,即窮盡列  
  39.     {  
  40.         Stack.push_back(col);//第row行的位置選擇第col列  
  41.         if (Judgement(Stack))                                             //判斷擺放皇后的位置是否安全  
  42.         {  
  43.             if (row<StackSize-1)                                     //若還沒有放到第八個皇后,則進行下一個皇后的放置  
  44.                 PlaceQueen(row+1,Stack);  
  45.             else 
  46.             {  
  47.                 ans++;                                               //解數加1  
  48.                 Output(Stack);                                            //打印成功的棋盤  
  49.             }  
  50.         }  
  51.         Stack.pop_back();                                                       //若不符合條件則出棧  
  52.     }  
  53.  
  54. }  
  55.  
  56. int main()  
  57. {  
  58.       deque<int> s;                            
  59.     PlaceQueen(0,s);                                        //從棧底開始賦值  
  60.     cout<<"the total number of solutions is:"<<ans<<endl;       //輸出擺放方法的總數  
  61.     system("pause");  
  62.     return 0;  
  63. }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章