-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathqueens.js
More file actions
55 lines (51 loc) · 1.48 KB
/
queens.js
File metadata and controls
55 lines (51 loc) · 1.48 KB
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
if (typeof window === 'undefined') {
csp = require(__dirname + '/csp.js');
util = require(__dirname + '/../util.js');
}
class QueensConstraint extends csp.Constraint {
constructor(columns) {
super(columns);
this.columns = columns;
}
satisfied(assignment) {
// q1c = queen1 column, q1r = queen 1 row
let q1c, q1r;
for ([q1c, q1r] of this.tuples(assignment)) {
// q2c = queen 2 column
for (let q2c = parseInt(q1c) + 1; q2c <= this.columns.length; q2c++) {
if (csp.member(Object.keys(assignment), q2c)) {
let q2r = assignment[q2c]; // q2r = queen 2 row
if (q1r == q2r) { // same row?
return false;
}
if (Math.abs(q1r - q2r) == Math.abs(q1c - q2c)) { // same diagonal?
return false;
}
}
}
}
return true; // no conflict
}
// Helper function to turn an object {key1: value1, key2: value2...}
// into an array of tuples: [[key1, value1], [key2, value2]...]
tuples(object) {
let result = [];
for (let key of Object.keys(object)) {
result.push([key, object[key]]);
}
return result;
}
}
let columns = [1, 2, 3, 4, 5, 6, 7, 8];
let rows = {};
for (let column of columns) {
rows[column] = [1, 2, 3, 4, 5, 6, 7, 8];
}
let qCsp = new csp.CSP(columns, rows);
qCsp.addConstraint(new QueensConstraint(columns));
let solution = qCsp.backtrackingSearch();
if (solution == null) {
util.out("No solution found!");
} else {
util.out(solution);
}