/*.h*/
#ifndef _NQUEEN_H
#define _NQUEEN_H
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Queen{
public:
Queen();
Queen(int num);
//~Queen();
void show(const vector<vector<string>>&input);
void solve();
private:
bool is_valid(const int row, const int col);
//void init(const int num);
void TraceBack(const int curRow);
private:
int m_num;
vector<int>pos;
vector<vector<string>>res;
};
#endif
/*cpp*/
#include"NQueen.h"
Queen::Queen(int num) :m_num(num), pos(4, -1){ }
void Queen::TraceBack(int curRow){
//cout << m_num << endl;
if (curRow == m_num)
{
vector<string>out(m_num, string(m_num, '*'));
for (int i = 0; i < m_num; i++){
out[i][pos[i]] = 'Q';
}
res.push_back(out);
}
else{
for (int col = 0; col < m_num; col++){
if (is_valid(curRow, col)){
pos[curRow] = col;
TraceBack(curRow + 1);
pos[curRow] = -1;
}
}
}
}
bool Queen::is_valid(int row, int col){
for (int i = 0; i < row; i++){
if (pos[i] == col || abs(i - row) == abs(pos[i] - col))
return false;
}
return true;
}
void Queen::solve(){
TraceBack(0);
//cout << res.size() << endl;
show(res);
}
void Queen::show(const vector<vector<string>>&input){
//cout << input.size() << endl;
//cout << input[0].size() << endl;
for (int i = 0; i < input.size(); i++){
for (int j = 0; j < input[0].size(); j++){
cout << input[i][j] << endl;
//if ((j + 1) % input.size() == 0)cout << input[i][j]<<e
}
cout << endl;
}
}