51. N-Queens

51. N-Queens

题目

解题思路

  1. 根据上图的方式是否位于同一对角线
  2. 开始按行遍历,在此过程性需要定义一个数组标明是否在对角线,列上已有皇后
  3. 这也就是回朔法,先试着走,不合适回退
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Solution {
boolean[][] visited;
private List<List<String>> res = new ArrayList<List<String>>();
public List<List<String>> solveNQueens(int n) {

List<StringBuffer> list = new ArrayList<StringBuffer>();
visited = new boolean[3][n*2];
for(int i=0; i<n;i++) {
StringBuffer sbuf = new StringBuffer();
for(int j=0;j<n;j++){
sbuf.append('.');
}
list.add(sbuf);
}
search(list, 0, n);

return res;
}

public void search(List<StringBuffer> list, int cur, int n) {
if(cur==n) {
ArrayList<String> list2 = new ArrayList<>();
for(StringBuffer sb: list) {
list2.add(sb.toString());
}
res.add(list2);
return ;
}else {
for(int i=0;i<n;i++) {
//System.out.println(cur-i+n+";;"+visited[0].length);
if(!visited[0][i]&&!visited[1][cur+i]
&&!visited[2][cur-i+n]) {
list.get(cur).setCharAt(i, 'Q');
visited[0][i] = visited[1][cur+i] = visited[2][cur-i+n]=true;
search(list, cur+1, n);

list.get(cur).setCharAt(i, '.');
visited[0][i] = visited[1][cur+i] = visited[2][cur-i+n] = false;
}
}
}


}

}

更快速的方法

参考链接


Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×