您的位置:首页 > 产品设计 > UI/UE

LeetCode: N-Queens

2017-06-12 10:09 323 查看
题目链接:https://leetcode.com/problems/n-queens/#/description

这是十分经典的八皇后问题的变形,以八皇后问题为例,在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。方法: 回溯法。

代码:

class Solution {
int *x;
public:
vector<vector<string> > solveNQueens(int n) {
vector<vector<int> > result_int;
vector<vector<string> > result;
vector<int> temp;
x = new int[n+1];
for(int i =0; i<n; i++) x[i] = 0;
n_queen(n, 1, result_int);
//  for(int i =0; i<n; i++) cout<<x[i];
for(vector<vector<int> >::iterator begin_2 = result_int.begin(); begin_2 != result_int.end(); begin_2++){
temp = *(begin_2);
for(vector<int>::iterator begin_1 = temp.begin(); begin_1 != temp.end(); begin_1++){
//  cout<<*begin_1<<endl;
}
}
convert(result_int, result,n);
return result;
}
void convert(vector<vector<int> > &vec_int, vector<vector<string> > &vec_str,int n){

vector<int> temp;
vector<string> temp_str;
string str(n,'.');
// cout<<str;
string strr;

for(vector<vector<int> >::iterator begin_2 = vec_int.begin(); begin_2 != vec_int.end(); begin_2++){
temp = *(begin_2);
for(vector<int>::iterator begin_1 = temp.begin(); begin_1 != temp.end(); begin_1++){
str.assign(n, '.');
str[*begin_1-1] = 'Q';
temp_str.push_back(str);
// if((begin_1+1) == temp.end())  {strr+= str;  str.assign(vec_int.size(), '.');  }
// else {strr+= (str+'.');  str.assign(vec_int.size(), '.');  };
}
vec_str.push_back(temp_str);
temp_str.clear();
}
return ;
}

void n_queen(int n, int k, vector<vector<int> > &result){
if(k > n){
vector<int> vec;
for(int i=1; i<=n; i++){
//   cout<<x[i];
vec.push_back(x[i]);
}
// cout<<endl;
result.push_back(vec);
}
else {
for(int i=1; i<=n; i++){
x[k] = i;
if(legal(k)) n_queen(n,k+1, result);
}
}
}

bool legal(int k){
for(int i=1; i<k; i++){
if((abs(x[i]-x[k]) == abs(i - k)) || x[i] == x[k] ) return false;
}
return true;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode