/**
* N皇后<br>
* https://leetcode-cn.com/problems/n-queens/ <br>
* 8.53% 递归暴力解..<br>
* 我的方法太水了<br>
*
* @author wuwang
*
*/
public class p51 {
public int totalNQueens(int n) {
List<List<String>> result = new ArrayList<>();
List<String> graph = new ArrayList<>(n);
char[] chs = new char[n];
for (int i = 0; i < chs.length; ++i)
chs[i] = '.';
String line = new String(chs);
// nxn
for (int i = 0; i < n; ++i)
graph.add(line);
for (int i = 0; i < n; ++i) {
dfs(0, i, clone(0, i, graph), result, n);
}
return result.size();
}
public void dfs(int h, int w, List<String> graph, List<List<String>> result, int len) {
int nh = h + 1;// x的下一行,之前的按照自上而下的顺序已经放置了皇后
if (nh < len) {
for (int i = 0; i < len; ++i) {
if (isvalid(graph, nh, i))
dfs(nh, i, clone(nh, i, graph), result, len);
}
} else {
result.add(graph);
}
}
public List<String> clone(int h, int w, List<String> oldGraph) {
List<String> result = new ArrayList<>(oldGraph.size());
for (int i = 0; i < oldGraph.size(); ++i) {
if (i == h) {
char[] chs = oldGraph.get(h).toCharArray();
chs[w] = 'Q';
result.add(new String(chs));
} else {
result.add(oldGraph.get(i));
}
}
return result;
}
public boolean isvalid(List<String> graph, int h, int w) {
int len = graph.size();
// 行列
for (int i = 0; i < len; ++i) {
if (graph.get(h).charAt(i) == 'Q' || graph.get(i).charAt(w) == 'Q') {
return false;
}
}
for (int i = h - Math.min(h, w), j = w - Math.min(h, w); i < len && j < len; ++i, ++j) {
if (graph.get(i).charAt(j) == 'Q') {
return false;
}
}
for (int i = h, j = w; i < len && j >= 0; ++i, --j) {
if (graph.get(i).charAt(j) == 'Q') {
return false;
}
}
for (int i = h, j = w; j < len && i >= 0; --i, ++j) {
if (graph.get(i).charAt(j) == 'Q') {
return false;
}
}
return true;
}
}