JavaScript: constraint satisfaction by backtracking
A constraint satisfaction problem has variables, domains of possible values, and constraints between variables. Map coloring assigns one of three colors to each Australian region so that no two neighbouring regions share a color.
JavaScript
const regions = ["WA", "NT", "SA", "Q", "NSW", "V", "T"];
const borders = [
["WA", "NT"], ["WA", "SA"], ["NT", "SA"], ["NT", "Q"], ["SA", "Q"],
["SA", "NSW"], ["SA", "V"], ["Q", "NSW"], ["NSW", "V"],
];
const colors = ["red", "green", "blue"];
function ok(assignment, region, color) {
return borders.every(([a, b]) => {
if (a === region && assignment[b] === color) return false;
if (b === region && assignment[a] === color) return false;
return true;
});
}
let count = 0;
let first = null;
function solve(index, assignment) {
if (index === regions.length) {
count++;
if (first === null) first = { ...assignment };
return;
}
const region = regions[index];
for (const color of colors) {
if (ok(assignment, region, color)) {
assignment[region] = color;
solve(index + 1, assignment);
delete assignment[region];
}
}
}
solve(0, {});
console.log("solutions: " + count);
console.log(regions.map((r) => r + "=" + first[r]).join(" "));