/*************************************************************************
* File Name: Solution.cpp
* Description:
* Author: Yuji CAO
* Mail: caoyuji@sogou-inc.com
* Created_Time: 2015-07-29 16时46分53秒
* Last modified: 2015-07-29 16时46分53秒
************************************************************************/
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<set>
using namespace std;
bool isAvailable(vector<char>&path,int n,int l,int pos){
for(int i=0;i<l;++i){
for(int j=0;j<n;++j){
if(path[i*n+j]=='Q'){
if(j==pos){
return false;
}else if((i-l)==(j-pos)||(i-l)==(-j+pos)){
return false;
}
}
}
}
return true;
}
void nqueue(vector< vector<char> >&ret,vector<char>& path,int n,int l){
if(l==n){
//push path to ret
/*
int i=0;
for(auto ele:path){
printf("%2c",ele);
i++;
if(i%n==0){
cout<<endl;
}
}
printf("\n");
*/
ret.push_back(path);
}
for(int i=0;i<n;++i){
if(isAvailable(path,n,l,i)){
path[l*n+i]='Q';
nqueue(ret,path,n,l+1);
path[l*n+i]='X';
}
}
}
vector< vector<char> > nqueue(int n){
vector< vector<char> > ret;
vector<char> path;
path.resize(n*n);
for(int i=0;i<n*n;++i){
path[i]='X';
}
nqueue(ret,path,n,0);
return ret;
}
int main(){
vector< vector<char> > ret=nqueue(4);
for(auto eleI:ret){
int i=0;
for(auto eleJ:eleI){
printf("%2c",eleJ);
i++;
if(i%4==0){
printf("\n");
}
}
printf("\n");
}
return 0;
}
分析
n后问题的解法是典型的暴力枚举法。值得研究~~