console
const house = [1, 2, 3, 4];
const map = [[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]];
const N = 5;
let count = 0;
let total = 0;
const check = function (num, x, y) {
if (map[x][y] >= num) return false;
const dirs = [[-1, -1], [1, -1], [1, 1], [-1, 1]];
switch (num) {
case 1:
return true;
case 2:
return dirs.some(dir => map[x + dir[0]][y + dir[1]] === 1);
case 3:
return dirs.some(dir => map[x + dir[0]][y + dir[1]] === 1) &&
dirs.some(dir => map[x + dir[0]][y + dir[1]] === 2)
case 4:
return dirs.some(dir => map[x + dir[0]][y + dir[1]] === 1) &&
dirs.some(dir => map[x + dir[0]][y + dir[1]] === 2) &&
dirs.some(dir => map[x + dir[0]][y + dir[1]] === 3)
}
}
const run = function () {
let i = 1;
while (true) {
if (i <= 0) return;
let x = (i - 1) % 5 + 1, y = Math.ceil(i / 5);
let flag = false;
for (let j = 0; j < house.length; j++) {
let h = house[j];
console.log(h, x, y, check(h, x, y))
if (check(h, x, y)) {
map[x][y] = h;
flag = true;
break;
}
}
if (!flag) {
map[x][y] = 0;
i--;
continue;
}
if (i >= N * N) {
calc();
map[x][y] = 0;
i--;
// continue;
break;
}
i++;
}
}
const calc = function () {
let num = 0;
for (let x = 1; x <= N; x++) {
for (let y = 1; y < N; y++) {
num += map[x][y];
}
}
if (num > total) {
total = num;
console.log(`new total(${count++}): ${total}`);
}
}
<button onclick="run()" style="width: 100px; height: 40px;">跑</button>