因爲棧stack的遍歷只能逐個pop,很麻煩,並且破壞了原來的棧,所以可以用deque來模擬棧。
- #include "stdafx.h"
- #include <iostream>
- #include <deque>
- #include <vector>
- using namespace std;
- const int StackSize=8; //定義棧的最大高度
- int ans=0; //初始化擺放方案計數器
- template <class T>
- bool Judgement(deque <T > Stack)
- {
- T topdata=Stack.back();
- for(int i=0;i<Stack.size()-1;i++) //依次檢查前面各行的皇后位置
- if(topdata==Stack[i]||(abs(topdata-Stack[i]))==(Stack.size()-1-i)) //判斷是否在同一列同一斜線
- return false;
- return true;
- }
- template <class T>
- void Output(deque <T > Stack) //將棧的數組形式打印成棋盤形式
- {
- cout<<"NO."<<ans<<":"<<endl;
- for(int i=0;i<StackSize;i++)
- {
- for(int j=0;j<Stack[i];j++)
- cout<<"- "; //不放置處打印“-”
- cout<<"Q"; //放置處打印“Q”
- for(int j=StackSize-1;j>Stack[i];j--)
- cout<<" -";
- cout<<endl; //換行
- }
- cout<<endl;
- }
- template <class T>
- void PlaceQueen(int row,deque <T > Stack) //在棧頂放置符合條件的值的操作,即擺放皇后
- {
- for (int col=0;col<StackSize;col++) //窮盡0~7,即窮盡列
- {
- Stack.push_back(col);//第row行的位置選擇第col列
- if (Judgement(Stack)) //判斷擺放皇后的位置是否安全
- {
- if (row<StackSize-1) //若還沒有放到第八個皇后,則進行下一個皇后的放置
- PlaceQueen(row+1,Stack);
- else
- {
- ans++; //解數加1
- Output(Stack); //打印成功的棋盤
- }
- }
- Stack.pop_back(); //若不符合條件則出棧
- }
- }
- int main()
- {
- deque<int> s;
- PlaceQueen(0,s); //從棧底開始賦值
- cout<<"the total number of solutions is:"<<ans<<endl; //輸出擺放方法的總數
- system("pause");
- return 0;
- }