DEV Community

Discussion on: Daily Challenge #107 - Escape the Mines

Collapse
 
erezwanderman profile image
erezwanderman
const solve = (caveMap: boolean[][], mine: [number, number], exit: [number, number]) => {
  if (mine[0] === exit[0] && mine[1] === exit[1]) {
    return [];
  }
  if (mine[0] > 0 && caveMap[mine[0] - 1][mine[1]]) {
    caveMap[mine[0] - 1][mine[1]] = false;
    const subSolution = solve(caveMap, [mine[0] - 1, mine[1]], exit);
    if (subSolution instanceof Array) return ['left', ...subSolution];
    caveMap[mine[0] - 1][mine[1]] = true;
  }
  if (mine[0] < caveMap.length - 1 && caveMap[mine[0] + 1][mine[1]]) {
    caveMap[mine[0] + 1][mine[1]] = false;
    const subSolution = solve(caveMap, [mine[0] + 1, mine[1]], exit);
    if (subSolution instanceof Array) return ['right', ...subSolution];
    caveMap[mine[0] + 1][mine[1]] = true;
  }
  if (mine[1] > 0 && caveMap[mine[0]][mine[1] - 1]) {
    caveMap[mine[0]][mine[1] - 1] = false;
    const subSolution = solve(caveMap, [mine[0], mine[1] - 1], exit);
    if (subSolution instanceof Array) return ['up', ...subSolution];
    caveMap[mine[0]][mine[1] - 1] = true;
  }
  if (mine[1] < caveMap[0].length - 1 && caveMap[mine[0]][mine[1] + 1]) {
    caveMap[mine[0]][mine[1] + 1] = false;
    const subSolution = solve(caveMap, [mine[0], mine[1] + 1], exit);
    if (subSolution instanceof Array) return ['down', ...subSolution];
    caveMap[mine[0]][mine[1] + 1] = true;
  }

  return 'No solution';
};

const testCases: [boolean[][], [number, number], [number, number]][] = [
  [ [[true, false], [true, true]], [0, 0], [1, 1] ],
  [ [[true], [true], [true], [true]], [0, 0], [3, 0] ],
  [ [[true, true, true], [false, false, true], [true, true, true]], [0, 0], [2, 0] ],
  [ [[true, true, false, false, false], [false, true, true, false, false], [false, false, true, true, false], [false, false, false, true, true], [false, false, false, false, true]], [0, 0], [4, 4] ],
];

for (const testCase of testCases) {
  console.log(testCase, solve(testCase[0], testCase[1], testCase[2]));
}

stackblitz.com/edit/typescript-vmdbzm