function touristPathfind(grid, start, end, allowDiag, hFn) {
const h = hFn || HEURISTICS.manhattan;
const prev = new Map();
const visited = new Set([key(start[0], start[1])]);
let r = start[0];
let c = start[1];
for (let step = 0; step < grid.length * grid[0].length * 4; step++) {
visitNode(r, c);
if (r === end[0] && c === end[1]) {
reconstructPath(prev, start, end);
return;
}
const neighbors = getNeighbors(grid, r, c, allowDiag);
if (!neighbors.length) break;
const fresh = neighbors.filter(([nr, nc]) => !visited.has(key(nr, nc)));
let pick;
if (fresh.length) {
sortByHeuristic(fresh, h, end[0], end[1]);
pick = fresh[0];
} else {
pick = neighbors[Math.floor(Math.random() * neighbors.length)];
}
const pk = key(pick[0], pick[1]);
visited.add(pk);
if (!prev.has(pk) && !(pick[0] === start[0] && pick[1] === start[1])) prev.set(pk, [r, c]);
r = pick[0];
c = pick[1];
pushFrontier(r, c);
}
reportNoPath();
} def touristPathfind(grid, start, end, allowDiag, hFn):
h = (hFn or HEURISTICS.manhattan)
prev = Map()
visited = Set([key(start[0], start[1])])
r = start[0]
c = start[1]
for step in range(((grid.length * grid[0].length) * 4)):
visitNode(r, c)
if ((r == end[0]) and (c == end[1])):
reconstructPath(prev, start, end)
return
neighbors = getNeighbors(grid, r, c, allowDiag)
if not neighbors.length:
break
fresh = [_v for _v in neighbors if not visited.has(key(nr, nc))]
pick = None
if fresh.length:
sortByHeuristic(fresh, h, end[0], end[1])
pick = fresh[0]
else:
pick = neighbors[int((random() * neighbors.length))]
pk = key(pick[0], pick[1])
visited.add(pk)
if (not prev.has(pk) and not ((pick[0] == start[0]) and (pick[1] == start[1]))):
prev.set(pk, [r, c])
r = pick[0]
c = pick[1]
pushFrontier(r, c)
reportNoPath() #include <vector>
#include <algorithm>
#include <cmath>
void touristPathfind(int grid, int start, int end, int allowDiag, int hFn) {
auto h = (hFn || HEURISTICS.manhattan);
auto prev = Map();
auto visited = Set([key(start[0], start[1])]);
auto r = start[0];
auto c = start[1];
for(int step=0; step<((grid.length * grid[0].length) * 4); step++) {
visitNode(r, c);
if(((r == end[0]) && (c == end[1]))) {
reconstructPath(prev, start, end);
return;
}
auto neighbors = getNeighbors(grid, r, c, allowDiag);
if(!neighbors.length) {
break;
}
std::vector<int> fresh; for(int _fi=0;_fi<n;_fi++) { int _v=neighbors[_fi]; if(!visited.has(key(nr, nc))) fresh.push_back(neighbors[_fi]); }
auto pick;
if(fresh.length) {
sortByHeuristic(fresh, h, end[0], end[1]);
pick = fresh[0];
} else {
pick = neighbors[(int)std::floor((std::random() * neighbors.length))];
}
auto pk = key(pick[0], pick[1]);
visited.add(pk);
if((!prev.has(pk) && !((pick[0] == start[0]) && (pick[1] == start[1])))) {
prev.set(pk, [r, c]);
}
r = pick[0];
c = pick[1];
pushFrontier(r, c);
}
reportNoPath();
} public void touristPathfind(int grid, int start, int end, int allowDiag, int hFn) {
var h = (hFn || HEURISTICS.manhattan);
var prev = Map();
var visited = Set([key(start[0], start[1])]);
var r = start[0];
var c = start[1];
for(int step=0; step<((grid.length * grid[0].length) * 4); step++) {
visitNode(r, c);
if(((r == end[0]) && (c == end[1]))) {
reconstructPath(prev, start, end);
return;
}
var neighbors = getNeighbors(grid, r, c, allowDiag);
if(!neighbors.length) {
break;
}
int[] fresh = new int[n]; int fresh_len=0; for(int _fi=0;_fi<n;_fi++) { int _v=neighbors[_fi]; if(!visited.has(key(nr, nc))) fresh[fresh_len++]=neighbors[_fi]; }
var pick;
if(fresh.length) {
sortByHeuristic(fresh, h, end[0], end[1]);
pick = fresh[0];
} else {
pick = neighbors[(int)Math.Floor((double)(random() * neighbors.length))];
}
var pk = key(pick[0], pick[1]);
visited.add(pk);
if((!prev.has(pk) && !((pick[0] == start[0]) && (pick[1] == start[1])))) {
prev.set(pk, [r, c]);
}
r = pick[0];
c = pick[1];
pushFrontier(r, c);
}
reportNoPath();
} #include <stdio.h>
#include <math.h>
void touristPathfind(int grid, int start, int end, int allowDiag, int hFn) {
var h = (hFn || HEURISTICS.manhattan);
var prev = Map();
var visited = Set([key(start[0], start[1])]);
var r = start[0];
var c = start[1];
for(int step=0; step<((grid.length * grid[0].length) * 4); step++) {
visitNode(r, c);
if(((r == end[0]) && (c == end[1]))) {
reconstructPath(prev, start, end);
return;
}
var neighbors = getNeighbors(grid, r, c, allowDiag);
if(!neighbors.length) {
break;
}
int fresh[n]; int fresh_len=0; for(int _fi=0;_fi<n;_fi++) { int _v=neighbors[_fi]; if(!visited.has(key(nr, nc))) fresh[fresh_len++]=neighbors[_fi]; }
var pick;
if(fresh.length) {
sortByHeuristic(fresh, h, end[0], end[1]);
pick = fresh[0];
} else {
pick = neighbors[(int)floor((random() * neighbors.length))];
}
var pk = key(pick[0], pick[1]);
visited.add(pk);
if((!prev.has(pk) && !((pick[0] == start[0]) && (pick[1] == start[1])))) {
prev.set(pk, [r, c]);
}
r = pick[0];
c = pick[1];
pushFrontier(r, c);
}
reportNoPath();
}