explode('-', $line), $input); $adjacencyList = []; foreach ($input as $key => $item) { if ($item[1] != 'start') $adjacencyList[$item[0]][] = $item[1]; if ($item[0] != 'start') $adjacencyList[$item[1]][] = $item[0]; } $history = []; echo track($adjacencyList, "start", $history, 0); function track($adjacencyList, $cave, $history, $doubled) { $count = 0; $history[] = $cave; foreach ($adjacencyList[$cave] as $path) { //small cave, not already visited if ($path == "start") { } elseif (strtolower($path) === $path && in_array($path, $history)) { if ($doubled == 0) { $count += track($adjacencyList, $path, $history, 1); } } elseif ($path == "end") { $count += 1; } else { $count += track($adjacencyList, $path, $history, $doubled); } } return $count; }