|
|
|
//implemtantion of dijkstra algorithm
|
|
|
|
|
|
|
|
|
|
|
|
var max = Number.MAX_SAFE_INTEGER-100;
|
|
|
|
|
|
|
|
|
|
|
|
function findNodeWithMinDistAndInQ(list, Q){
|
|
|
|
var result = "NaN";
|
|
|
|
var dist = max;
|
|
|
|
for(var i = 0; i < Q.length; i++){
|
|
|
|
//console.log(Q[i]);
|
|
|
|
if(list.get(Q[i]) < dist){
|
|
|
|
dist = list.get(Q[i]);
|
|
|
|
result = Q[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//console.log("result: "+result);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getNeighbours(array, i,j){
|
|
|
|
var result = [];
|
|
|
|
if((i-1) > -1 && (i+1) < array.length && (j-1) > -1 && j+1 < array[i].length){
|
|
|
|
for(var k = -1; k < 2; k++){
|
|
|
|
for(var l = -1; l < 2; l++){
|
|
|
|
var row =i+k;
|
|
|
|
var coloumn=j+l;
|
|
|
|
if(array[row][coloumn].accessible){
|
|
|
|
result.push(row+"$"+coloumn);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
|
|
|
|
for(var k = -1; k < 2; k++){
|
|
|
|
for(var l = -1; l < 2; l++){
|
|
|
|
var row =i+k;
|
|
|
|
var coloumn=j+l;
|
|
|
|
try{
|
|
|
|
if(array[row][coloumn].accessible){
|
|
|
|
result.push(row+"$"+coloumn);
|
|
|
|
}
|
|
|
|
} catch(e){
|
|
|
|
////console.log("zugriff auserhalb des feldes");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
function dijkstra(array, start_i, start_j, end_i,end_j){
|
|
|
|
|
|
|
|
var Q = [];
|
|
|
|
var distance = new Map();
|
|
|
|
var pre = new Map();
|
|
|
|
|
|
|
|
|
|
|
|
for(var i = 0; i < array.length; i++){
|
|
|
|
for(var j = 0; j < array[i].length; j++){
|
|
|
|
var tmp = i+"$"+j;
|
|
|
|
distance.set(tmp, max);
|
|
|
|
pre.set(tmp, null);
|
|
|
|
Q.push(tmp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
distance.set(start_i+"$"+start_j, 0);
|
|
|
|
var t = 0;
|
|
|
|
while (Q.length !== 0){
|
|
|
|
var node = findNodeWithMinDistAndInQ(distance,Q);
|
|
|
|
if(node === "NaN"){
|
|
|
|
console.log(Q);
|
|
|
|
console.log(distance);
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
Q.splice(Q.indexOf(node),1);
|
|
|
|
var indices = node.split("$");
|
|
|
|
indices[0] = parseInt(10, indices[0]);
|
|
|
|
indices[1] = parseInt(10, indices[1]);
|
|
|
|
|
|
|
|
var neighbours = getNeighbours(array,indices[0],indices[1]);
|
|
|
|
//console.log(node+" === "+end_i+"$"+end_j);
|
|
|
|
|
|
|
|
if(node.localeCompare(end_i+"$"+end_j) === 0){
|
|
|
|
|
|
|
|
console.log("YAY");
|
|
|
|
|
|
|
|
console.log(t);
|
|
|
|
console.log(distance);
|
|
|
|
console.log(pre);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return reverse(end_i+"$"+end_j,start_i+"$"+start_j,pre);
|
|
|
|
}
|
|
|
|
for(var i = 0; i < neighbours.length; i++){
|
|
|
|
var alt = distance.get(node)+1;
|
|
|
|
|
|
|
|
if(Q.includes(neighbours[i])){
|
|
|
|
if(alt < distance.get(neighbours[i])){
|
|
|
|
distance.set(neighbours[i], alt);
|
|
|
|
pre.set(neighbours[i], node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//console.log(t);
|
|
|
|
t++;
|
|
|
|
}//
|
|
|
|
|
|
|
|
console.log(t);
|
|
|
|
console.log(distance);
|
|
|
|
console.log(pre);
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function reverse(target, source, pre){
|
|
|
|
var path = [];
|
|
|
|
var u = target;
|
|
|
|
|
|
|
|
console.log("target: "+target);
|
|
|
|
console.log("source: "+source);
|
|
|
|
if(pre.get(u) != null || u === source){
|
|
|
|
console.log("hallo");
|
|
|
|
while(u != null){
|
|
|
|
console.log("hallo");
|
|
|
|
u = pre.get(u);
|
|
|
|
path = [u].concat(path);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
path.push(target);
|
|
|
|
path.shift();
|
|
|
|
|
|
|
|
|
|
|
|
console.log("!!!!")
|
|
|
|
console.log(path);
|
|
|
|
|
|
|
|
return path;
|
|
|
|
|
|
|
|
|
|
|
|
}
|