function bidirectionalPathfind(grid, start, end, allowDiag) {
const startKey = key(start[0], start[1]);
const endKey = key(end[0], end[1]);
const visitedA = new Map([[startKey, null]]);
const visitedB = new Map([[endKey, null]]);
let frontierA = [[start[0], start[1]]];
let frontierB = [[end[0], end[1]]];
while (frontierA.length && frontierB.length) {
const nextA = [];
for (const [cr, cc] of frontierA) {
visitForwardNode(cr, cc);
const currentKey = key(cr, cc);
if (visitedB.has(currentKey)) {
reconstructBidirectionalPath(visitedA, visitedB, currentKey, start, end);
return;
}
for (const [nr, nc] of getNeighbors(grid, cr, cc, allowDiag)) {
const neighborKey = key(nr, nc);
if (visitedA.has(neighborKey)) continue;
visitedA.set(neighborKey, [cr, cc]);
nextA.push([nr, nc]);
pushFrontier(nr, nc);
}
}
frontierA = nextA;
const nextB = [];
for (const [cr, cc] of frontierB) {
visitBackwardNode(cr, cc);
const currentKey = key(cr, cc);
if (visitedA.has(currentKey)) {
reconstructBidirectionalPath(visitedA, visitedB, currentKey, start, end);
return;
}
for (const [nr, nc] of getNeighbors(grid, cr, cc, allowDiag)) {
const neighborKey = key(nr, nc);
if (visitedB.has(neighborKey)) continue;
visitedB.set(neighborKey, [cr, cc]);
nextB.push([nr, nc]);
pushFrontier(nr, nc);
}
}
frontierB = nextB;
}
reportNoPath();
} def bidirectionalPathfind(grid, start, end, allowDiag):
startKey = key(start[0], start[1])
endKey = key(end[0], end[1])
visitedA = Map([[startKey, None]])
visitedB = Map([[endKey, None]])
frontierA = [[start[0], start[1]]]
frontierB = [[end[0], end[1]]]
while (frontierA.length and frontierB.length):
nextA = []
for cr, cc in frontierA:
visitForwardNode(cr, cc)
currentKey = key(cr, cc)
if visitedB.has(currentKey):
reconstructBidirectionalPath(visitedA, visitedB, currentKey, start, end)
return
for nr, nc in getNeighbors(grid, cr, cc, allowDiag):
neighborKey = key(nr, nc)
if visitedA.has(neighborKey):
continue
visitedA.set(neighborKey, [cr, cc])
nextA.push([nr, nc])
pushFrontier(nr, nc)
frontierA = nextA
nextB = []
for cr, cc in frontierB:
visitBackwardNode(cr, cc)
currentKey = key(cr, cc)
if visitedA.has(currentKey):
reconstructBidirectionalPath(visitedA, visitedB, currentKey, start, end)
return
for nr, nc in getNeighbors(grid, cr, cc, allowDiag):
neighborKey = key(nr, nc)
if visitedB.has(neighborKey):
continue
visitedB.set(neighborKey, [cr, cc])
nextB.push([nr, nc])
pushFrontier(nr, nc)
frontierB = nextB
reportNoPath() #include <vector>
#include <algorithm>
void bidirectionalPathfind(int grid, int start, int end, int allowDiag) {
auto startKey = key(start[0], start[1]);
auto endKey = key(end[0], end[1]);
auto visitedA = Map([[startKey, null]]);
auto visitedB = Map([[endKey, null]]);
auto frontierA = [[start[0], start[1]]];
auto frontierB = [[end[0], end[1]]];
while((frontierA.length && frontierB.length)) {
auto nextA = [];
for(auto& [cr, cc] : frontierA) {
visitForwardNode(cr, cc);
auto currentKey = key(cr, cc);
if(visitedB.has(currentKey)) {
reconstructBidirectionalPath(visitedA, visitedB, currentKey, start, end);
return;
}
for(auto& [nr, nc] : getNeighbors(grid, cr, cc, allowDiag)) {
auto neighborKey = key(nr, nc);
if(visitedA.has(neighborKey)) {
continue;
}
visitedA.set(neighborKey, [cr, cc]);
nextA.push([nr, nc]);
pushFrontier(nr, nc);
}
}
frontierA = nextA;
auto nextB = [];
for(auto& [cr, cc] : frontierB) {
visitBackwardNode(cr, cc);
auto currentKey = key(cr, cc);
if(visitedA.has(currentKey)) {
reconstructBidirectionalPath(visitedA, visitedB, currentKey, start, end);
return;
}
for(auto& [nr, nc] : getNeighbors(grid, cr, cc, allowDiag)) {
auto neighborKey = key(nr, nc);
if(visitedB.has(neighborKey)) {
continue;
}
visitedB.set(neighborKey, [cr, cc]);
nextB.push([nr, nc]);
pushFrontier(nr, nc);
}
}
frontierB = nextB;
}
reportNoPath();
} public void bidirectionalPathfind(int grid, int start, int end, int allowDiag) {
var startKey = key(start[0], start[1]);
var endKey = key(end[0], end[1]);
var visitedA = Map([[startKey, null]]);
var visitedB = Map([[endKey, null]]);
var frontierA = [[start[0], start[1]]];
var frontierB = [[end[0], end[1]]];
while((frontierA.length && frontierB.length)) {
var nextA = [];
foreach(var (cr, cc) in frontierA) {
visitForwardNode(cr, cc);
var currentKey = key(cr, cc);
if(visitedB.has(currentKey)) {
reconstructBidirectionalPath(visitedA, visitedB, currentKey, start, end);
return;
}
foreach(var (nr, nc) in getNeighbors(grid, cr, cc, allowDiag)) {
var neighborKey = key(nr, nc);
if(visitedA.has(neighborKey)) {
continue;
}
visitedA.set(neighborKey, [cr, cc]);
nextA.push([nr, nc]);
pushFrontier(nr, nc);
}
}
frontierA = nextA;
var nextB = [];
foreach(var (cr, cc) in frontierB) {
visitBackwardNode(cr, cc);
var currentKey = key(cr, cc);
if(visitedA.has(currentKey)) {
reconstructBidirectionalPath(visitedA, visitedB, currentKey, start, end);
return;
}
foreach(var (nr, nc) in getNeighbors(grid, cr, cc, allowDiag)) {
var neighborKey = key(nr, nc);
if(visitedB.has(neighborKey)) {
continue;
}
visitedB.set(neighborKey, [cr, cc]);
nextB.push([nr, nc]);
pushFrontier(nr, nc);
}
}
frontierB = nextB;
}
reportNoPath();
} #include <stdio.h>
void bidirectionalPathfind(int grid, int start, int end, int allowDiag) {
var startKey = key(start[0], start[1]);
var endKey = key(end[0], end[1]);
var visitedA = Map([[startKey, null]]);
var visitedB = Map([[endKey, null]]);
var frontierA = [[start[0], start[1]]];
var frontierB = [[end[0], end[1]]];
while((frontierA.length && frontierB.length)) {
var nextA = [];
for(int _fod_i = 0; _fod_i < frontierA_len; _fod_i++) {
int cr = frontierA[_fod_i][0];
int cc = frontierA[_fod_i][1];
visitForwardNode(cr, cc);
var currentKey = key(cr, cc);
if(visitedB.has(currentKey)) {
reconstructBidirectionalPath(visitedA, visitedB, currentKey, start, end);
return;
}
for(int _fod_i = 0; _fod_i < getNeighbors(grid, cr, cc, allowDiag)_len; _fod_i++) {
int nr = getNeighbors(grid, cr, cc, allowDiag)[_fod_i][0];
int nc = getNeighbors(grid, cr, cc, allowDiag)[_fod_i][1];
var neighborKey = key(nr, nc);
if(visitedA.has(neighborKey)) {
continue;
}
visitedA.set(neighborKey, [cr, cc]);
nextA.push([nr, nc]);
pushFrontier(nr, nc);
}
}
frontierA = nextA;
var nextB = [];
for(int _fod_i = 0; _fod_i < frontierB_len; _fod_i++) {
int cr = frontierB[_fod_i][0];
int cc = frontierB[_fod_i][1];
visitBackwardNode(cr, cc);
var currentKey = key(cr, cc);
if(visitedA.has(currentKey)) {
reconstructBidirectionalPath(visitedA, visitedB, currentKey, start, end);
return;
}
for(int _fod_i = 0; _fod_i < getNeighbors(grid, cr, cc, allowDiag)_len; _fod_i++) {
int nr = getNeighbors(grid, cr, cc, allowDiag)[_fod_i][0];
int nc = getNeighbors(grid, cr, cc, allowDiag)[_fod_i][1];
var neighborKey = key(nr, nc);
if(visitedB.has(neighborKey)) {
continue;
}
visitedB.set(neighborKey, [cr, cc]);
nextB.push([nr, nc]);
pushFrontier(nr, nc);
}
}
frontierB = nextB;
}
reportNoPath();
}