N-Queens
Total Accepted: 5516 Total Submissions: 21906The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where 'Q'
and '.'
both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
回溯+开数组记录之前选择
>.<这里不知道n的范围数组真的不好搞,无奈只有new一个了。注意关于C++new对内存初始化的情况,http://hi.baidu.com/maxy218/item/8cd098256327c1829d63d1ca
实际测试下来,加不加(),运行结果都是正确的,也就是说都初始化为0了,但是初始化是个好习惯!
然后由于返回值是字符串,于是对string构造函数又长了见识
string (size_t n, char c);
(6) fill constructor
Fills the string with n consecutive copies of character c.
class Solution {
int *rec;
bool *row, *l, *r;
public:
vector<vector<string> > solveNQueens(int n) {
vector<vector<string> > ans;
rec = new int[n]();
row = new bool[n]();
l = new bool[2 * n]();
r = new bool[2 * n]();
dfs(0, n, ans);
delete(rec);
delete(row);
delete(l);
delete(r);
return ans;
}
void dfs(int s, int n, vector<vector<string> >& ans) {
if (s == n) {
vector<string> vec;
for (int i = 0; i < n; i++) {
string str(n, '.');
str[rec[i]] = 'Q';
vec.push_back(str);
}
ans.push_back(vec);
return;
}
for (int i = 0; i < n; i++) {
if (!row[i] && !l[s + i] && !r[s - i + n - 1]) {
rec[s] = i;
row[i] = true;
l[s + i] = true;
r[s - i + n - 1] = true;
dfs(s + 1, n, ans);
row[i] = false;
l[s + i] = false;
r[s - i + n - 1] = false;
}
}
}
};