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

LeetCode N-Queens

2014-03-16 10:03 447 查看


N-Queens

 Total Accepted: 5516 Total
Submissions: 21906

The 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
();
row = new bool
();
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;
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode Oj