Skip to content

Instantly share code, notes, and snippets.

@prashantpandey10
Created November 12, 2018 20:54
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 prashantpandey10/a054957382aaa1f78c3cf2fa2c1bfb33 to your computer and use it in GitHub Desktop.
Save prashantpandey10/a054957382aaa1f78c3cf2fa2c1bfb33 to your computer and use it in GitHub Desktop.
Robby the robot solution
function getCommands(field, power) {
var sideLength = Math.sqrt(field.length);
var starti = 0, startj = 0, endi = 0, endj = 0;
for (let i = 0; i < sideLength; i++) {
for (let j = 0; j < sideLength; j++) {
if (field[i * sideLength + j] == 'S') {
starti = i;
startj = j;
}
if (field[i * sideLength + j] == 'T') {
endi = i;
endj = j;
}
}
}
var queue = [{i: starti, j: startj, d: 'n', p: power, path: [], visited: [[starti, startj].toString()]}];
while (queue.length > 0) {
let s = queue.shift();
let i = s.i, j = s.j, d = s.d, p = s.p, path = s.path, visited = s.visited;
if (i == endi && j == endj)
return path.length <= power ? path : [];
if (i < 0 || i >= sideLength || j < 0 || j >= sideLength || field[i * sideLength + j] == '#' || p == 0)
continue;
if (d == 'n') {
let temp = path.slice();
let v = visited.slice();
if (j + 1 < sideLength && v.indexOf([i, j + 1].toString()) == -1) {
temp.push('r');
queue.push({i: i, j: j, d: 'e', p: p - 1, path: temp, visited: v});
}
temp = path.slice();
if (j - 1 >= 0 && v.indexOf([i, j - 1].toString()) == -1) {
temp.push('l');
queue.push({i: i, j: j, d: 'w', p: p - 1, path: temp, visited: v});
}
temp = path.slice();
if (v.indexOf([i - 1, j].toString()) == -1) {
temp.push('f');
v.push([i - 1, j].toString());
queue.push({i: i - 1, j: j, d: 'n', p: p - 1, path: temp, visited: v});
}
}
else if (d == 's') {
let temp = path.slice();
let v = visited.slice();
if (j + 1 < sideLength && v.indexOf([i, j + 1].toString()) == -1) {
temp.push('r');
queue.push({i: i, j: j, d: 'w', p: p - 1, path: temp, visited: v});
}
temp = path.slice();
if (j - 1 >= 0 && v.indexOf([i, j - 1].toString()) == -1) {
temp.push('l');
queue.push({i: i, j: j, d: 'e', p: p - 1, path: temp, visited: v});
}
temp = path.slice();
if (v.indexOf([i + 1, j].toString()) == -1) {
temp.push('f');
v.push([i + 1, j].toString());
queue.push({i: i + 1, j: j, d: 's', p: p - 1, path: temp, visited: v});
}
}
else if (d == 'e') {
let temp = path.slice();
let v = visited.slice();
if (i + 1 < sideLength && v.indexOf([i + 1, j].toString()) == -1) {
temp.push('r');
queue.push({i: i, j: j, d: 's', p: p - 1, path: temp, visited: v});
}
temp = path.slice();
if (i - 1 >= 0 && v.indexOf([i - 1, j].toString()) == -1) {
temp.push('l');
queue.push({i: i, j: j, d: 'n', p: p - 1, path: temp, visited: v});
}
temp = path.slice();
if (v.indexOf([i, j + 1].toString()) == -1) {
temp.push('f');
v.push([i, j + 1].toString());
queue.push({i: i, j: j + 1, d: 'e', p: p - 1, path: temp, visited: v});
}
}
else if (d == 'w') {
let temp = path.slice();
let v = visited.slice();
if (i - 1 >= 0 && v.indexOf([i - 1, j].toString()) == -1) {
temp.push('r');
queue.push({i: i, j: j, d: 'n', p: p - 1, path: temp, visited: v});
}
temp = path.slice();
if (i + 1 < sideLength && v.indexOf([i + 1, j].toString()) == -1) {
temp.push('l');
queue.push({i: i, j: j, d: 's', p: p - 1, path: temp, visited: v});
}
temp = path.slice();
if (v.indexOf([i, j - 1].toString()) == -1) {
temp.push('f');
v.push([i, j - 1].toString());
queue.push({i: i, j: j - 1, d: 'w', p: p - 1, path: temp, visited: v});
}
}
}
return [];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment