用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. }  

 

你可能感兴趣的:(stack,八皇后,deque)