不知道为什么我没有任何评论就被否决了,但我想我设法解决了:
$availableTracks = [[1,4],[3,5],[2,3,5],[1,2],[2,4]];
$availableTracks2 = [[1,4],[3,5],[2,3,5],[1],[2,4]];
function findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode){
$maxLength = count($pairedtracks[$level]);
if ($nodeElement == $maxLength){
echo "[Back up more]<br>";
echo "Current pair: [";
foreach ($pairedtracks[$level] as &$pairElement){
echo $pairElement.",";
}
echo "]<br>";
echo "Current path: [";
foreach ($currentPath as &$pathElement){
echo $pathElement.",";
}
echo "]<br>";
//Current was final, return back up
$level -= 1;
$lastInserted = $currentPath[count($currentPath)-1];
//Take index from previous level
$indexNumber = 0;
foreach ($pairedtracks[$level] as &$pairElement){
echo "Pair: ".$pairElement."<br>";
if ($pairElement == $lastInserted){
break;
}
$indexNumber += 1;
}
echo "Previous element was on index ".$indexNumber."<br>";
$nodeElement = $indexNumber+1;
echo "Moving back up to level: ".$level.", starting iteration from: ".$nodeElement.", removed element: ".$currentPath[count($currentPath)-1];
echo "<br>";
// Remove previously added element from that level!
array_splice($currentPath, count($currentPath)-1, 1);
return findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode);
}
else if (in_array($pairedtracks[$level][$nodeElement],$currentPath)){
echo "[IN ARRAY]: Node element in current: ".$pairedtracks[$level][$nodeElement]." on level: ".$level;
echo "<br>";
//Check if node element is in array
if ($nodeElement+1 >= $maxLength){
//Current was final, return back up
$level -= 1;
$lastInserted = $currentPath[count($currentPath)-1];
//Take index from previous level
$indexNumber = 0;
foreach ($pairedtracks[$level] as &$pairElement){
if ($pairElement == $lastInserted){
break;
}
$indexNumber += 1;
}
echo "Previous element was on index ".$indexNumber."<br>";
$nodeElement = $indexNumber+1;
echo "Moving back up to level: ".$level.", starting iteration from: ".$nodeElement.", removed element: ".$currentPath[count($currentPath)-1];
echo "<br>";
// Remove previously added element from that level!
array_splice($currentPath, count($currentPath)-1, 1);
return findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode);
}
else {
//More elements to follow
$nodeElement += 1;
return findBestPath($pairedtracks,$currentPath,$level,$nodeElement,$previousNode);
}
}
else {
//Was not in array, element can be added to current path
echo "Adding element to current path: ".$pairedtracks[$level][$nodeElement];
echo "<br>";
$currentPath[] = $pairedtracks[$level][$nodeElement];
//Check if path has finalized or check more
if (count($currentPath) == count($pairedtracks)){
//Search finished
return $currentPath;
}
else {
//Move downwards
$level += 1;
return findBestPath($pairedtracks,$currentPath,$level,0,$nodeElement);
}
}
}
$path = findBestPath($availableTracks,[],0,0,0);
foreach ($path as &$value) {
echo $value." ";
}
我用过
currentPath
作为记忆工具。在回到上一级之前,我把最后一个元素
当前路径
(移回顶部时移除的那个)并检查上面的索引是什么。然后我从那个索引开始迭代(因为以前的索引已经完成了)。