-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path51_javascript.js
105 lines (86 loc) · 2.52 KB
/
51_javascript.js
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
// 上图为 8 皇后问题的一种解法。
// 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
// 每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
// 链接:https://leetcode-cn.com/problems/n-queens
/**
* @param {number} n
* @return {string[][]}
*/
var solveNQueens = function (n) {
let res = [];
let arr = Array.from(new Array(n), value => new Array(n).fill('.'));
let isValid = (row, col) => {
for (let i = 0; i < row; i++) {
for (let j = 0; j < n; j++) {
if (arr[i][j] == 'Q' && (j == col || i - j == row - col || i + j == row + col)) {
return false
}
}
}
return true;
}
let dfs = (row) => {
if (row == n) {
let tempArr = arr.slice();
for (let i = 0; i < n; i++) {
tempArr[i] = tempArr[i].join('');
}
res.push(tempArr);
return;
}
for (let i = 0; i < n; i++) {
if (isValid(row, i)) {
arr[row][i] = 'Q';
dfs(row + 1);
arr[row][i] = '.';
}
}
}
dfs(0);
return res;
};
// 题解 https://leetcode-cn.com/problems/n-queens/solution/shou-hua-tu-jie-cong-jing-dian-de-nhuang-hou-wen-t/
// 使用hash值优化
var solveNQueens = function (n) {
let res = [];
let arr = Array.from(new Array(n), value => new Array(n).fill('.'));
// let isValid = (row ,col) =>{
// for(let i=0; i<row; i++){
// for(let j=0; j<n; j++){
// if( arr[i][j] == 'Q' && (j == col || i - j == row - col || i+j == row +col) ){
// return false
// }
// }
// }
// return true;
// }
let colSet = new Set();
let diagonaSet1 = new Set();
let diagonaSet2 = new Set();
let dfs = (row) => {
if (row == n) {
let tempArr = arr.slice();
for (let i = 0; i < n; i++) {
tempArr[i] = tempArr[i].join('');
}
res.push(tempArr);
return;
}
for (let i = 0; i < n; i++) {
if(!colSet.has(i) &&!diagonaSet1.has(row+i) && !diagonaSet2.has(row-i)){
colSet.add(i);
diagonaSet1.add(row+i);
diagonaSet2.add(row-i);
arr[row][i] = 'Q';
dfs(row + 1);
arr[row][i] = '.';
colSet.delete(i);
diagonaSet1.delete(row+i);
diagonaSet2.delete(row-i);
}
}
}
dfs(0);
return res;
};