queens.h
- #include <vector>
- #include <utility>
- #include <iterator>
- using namespace std;
- typedef pair<int,int> xy;
- class Queens
- {
- private:
- int QueensNum;
- vector<xy> inQueens;
- vector<int> Avai;
- vector<vector<int>> Solution;
- bool isDiagonal(int row,int col,int srcrow,int srccol);
- bool isBan(int row,int col);
- bool SolveProblem(int row,int col);
- public:
- Queens(int n)
- {
- QueensNum=n;
- for(int i=0;i<n;i++)
- Avai.push_back(i);
- }
- void StartProblem();
- void ShowResult();
- };
- void Queens::ShowResult()
- {
- for(int i=0;i<Solution.size();i++){
- copy(Solution[i].begin(),Solution[i].end(),ostream_iterator<int>(cout," "));
- cout<<endl;
- }
- cout<<Solution.size()<<endl;
- }
- void Queens::StartProblem()
- {
- for(int i=0;i<QueensNum;i++)
- SolveProblem(0,i);
- }
- bool Queens::SolveProblem(int row,int col)
- {
- if( isBan(row,col)==true ) return false;
- inQueens.push_back(xy(row,col));
- if(inQueens.size()==QueensNum)
- {
- vector<int> result;
- for(int i=0;i<inQueens.size();i++)
- result.push_back(inQueens[i].second);
- Solution.push_back(result);
- inQueens.pop_back(); //找到一个解,回溯
- return true;
- }
- row++;
- for(int i=0;i<QueensNum;i++)
- SolveProblem(row,i);
- inQueens.pop_back(); //往后没有解,也回溯
- }
- bool Queens::isDiagonal(int row,int col,int srcrow,int srccol)
- {
- double k=((row-srcrow)*1.0)/(col-srccol);
- if(k==1 || k==-1) return true;
- else return false;
- }
- bool Queens::isBan(int row,int col)
- {
- for(int i=0;i<inQueens.size();i++)
- {
- if(inQueens[i].second==col) return true;
- if(isDiagonal(row,col,inQueens[i].first,inQueens[i].second)==true) return true;
- /*if(inQueens[i].second>0 && inQueens[i].second-1==col ) return true;
- if(inQueens[i].second<QueensNum-1 && inQueens[i].second+1==col) return true;*/
- }
- return false;
- }
queens.cpp
- #include <iostream>
- #include "queens.h"
- using namespace std;
- void main()
- {
- Queens queens(8);
- queens.StartProblem();
- queens.ShowResult();
- }