//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; }