Skip to content

Instantly share code, notes, and snippets.

@JasonKleban
Created August 11, 2017 23:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JasonKleban/9317f15af2c548b7f0faa486fed600ed to your computer and use it in GitHub Desktop.
Save JasonKleban/9317f15af2c548b7f0faa486fed600ed to your computer and use it in GitHub Desktop.
solves a blocks puzzle
window.addEventListener('load', function(e) {
var pieces = [
[ 28, 6 ],
[ 28, 14 ],
[ 21, 18 ],
[ 10, 7 ],
[ 32, 11 ],
[ 14, 4 ],
[ 28, 7 ],
[ 21, 14 ],
[ 21, 18 ],
[ 17, 14 ],
[ 21, 14 ],
[ 32, 10 ]
];
window.setTimeout(function () {
var grid = makeArray(56,56,0);
var ans = permute(grid, pieces);
console.log(ans);
}, 0);
}, false);
function permute(grid, remaining) {
//console.log(remaining.length);
var start = openCorner(grid);
if (start === null) return '';
for(var r = 0; r < remaining.length; r++) {
var a = remaining[r];
var next = remaining.slice(0);
next.splice(r, 1);
if (tryPaint(grid, start, a, 1)) {
var got = permute(grid, next);
if (got != null) {
return ', (' + a[0] + ', ' + a[1] + ') @ (' + start[0] + ', ' + start[1] + ')' + got;
}
tryPaint(grid, start, a, -1);
}
var b = [ a[1], a[0] ];
if (tryPaint(grid, start, b, 1)) {
got = permute(grid, next);
if (got != null) {
return ', (' + b[0] + ', ' + b[1] + ') @ (' + start[0] + ', ' + start[1] + ')' + got;
}
tryPaint(grid, start, b, -1);
}
}
return null;
}
function tryPaint(grid, start, size, delta) {
if (56 < start[0] + size[0] ||
56 < start[1] + size[1])
return false;
for (var x = start[0]; x < start[0] + size[0]; x++)
for (var y = start[1]; y < start[1] + size[1]; y++) {
var w = grid[x][y] + delta;
if (w < 0 || 1 < w)
return false;
}
for (var x = start[0]; x < start[0] + size[0]; x++)
for (var y = start[1]; y < start[1] + size[1]; y++) {
grid[x][y] += delta;
}
return true;
}
function openCorner(grid) {
for (var x = 0; x < 56; x++)
for (var y = 0; y < 56; y++) {
if (grid[x][y] === 0)
return [ x, y ];
}
return null;
}
function makeArray(w, h, val) {
var arr = [];
for(i = 0; i < h; i++) {
arr[i] = [];
for(j = 0; j < w; j++) {
arr[i][j] = val;
}
}
return arr;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment