🚀 improve clean layer

This commit is contained in:
platane
2020-10-24 11:19:49 +02:00
parent 4f9ff10741
commit b9c67baa6a
3 changed files with 86 additions and 48 deletions

View File

@@ -0,0 +1,59 @@
/**
* clean layer is too expensive with solution branching
* do not branch for faster result ( at the cost of finding a minimal step number )
*/
import { copyGrid, setColorEmpty } from "@snk/types/grid";
import { getHeadX, getHeadY } from "@snk/types/snake";
import { getAvailableRoutes } from "./getAvailableRoutes";
import type { Snake } from "@snk/types/snake";
import type { Grid } from "@snk/types/grid";
import type { Point } from "@snk/types/point";
export const getAvailableWhiteListedRoute = (
grid: Grid,
snake: Snake,
whiteList: Point[]
) => {
let solution: Snake[] | null;
getAvailableRoutes(grid, snake, (chain) => {
const hx = getHeadX(chain[0]);
const hy = getHeadY(chain[0]);
if (!whiteList.some(({ x, y }) => hx === x && hy === y)) return false;
solution = chain;
return true;
});
// @ts-ignore
return solution;
};
export const cleanLayer = (grid0: Grid, snake0: Snake, chunk0: Point[]) => {
const chunk = chunk0.slice();
const grid = copyGrid(grid0);
let snake = snake0;
const chain: Snake[] = [];
while (chunk.length) {
const chainN = getAvailableWhiteListedRoute(grid, snake, chunk);
if (!chainN) throw new Error("some cells are unreachable");
chain.unshift(...chainN);
snake = chain[0];
const x = getHeadX(snake);
const y = getHeadY(snake);
setColorEmpty(grid, x, y);
const i = chunk.findIndex((c) => c.x === x && c.y === y);
chunk.splice(i, 1);
}
return chain;
};