import java.util.*; class NumberMaze { int n = (int) 1e9; int m = (int) 1e9 - 5; timedSearch(n); timedSearch(m); for (int i=0; i<1000; i++) findPath(n); // warmup timedSearch(n); timedSearch(m); } public static void timedSearch(int n) { ArrayDeque<Integer> path = findPath(n); double total = (end - start) * 1e-6; } public static ArrayDeque<Integer> findPath(int n) { seen.put(n, n); int pathLength = 0; // Find the path while (!seen.containsKey(1)) { List<Integer> newActive = new ArrayList<>(active.size()*3); for (int x : active) { if (x % 3 == 0 && !seen.containsKey(x/3)) { newActive.add(x/3); seen.put(x/3, x); } if (x % 2 == 0 && !seen.containsKey(x/2)) { newActive.add(x/2); seen.put(x/2, x); } if (!seen.containsKey(x-1)) { newActive.add(x-1); seen.put(x-1, x); } active = newActive; } } // Reconstruct the path ArrayDeque<Integer> path = new ArrayDeque<>(pathLength); int x = 1; int y = seen.get(x); while (x != y) { path.push(y / x); x = y; y = seen.get(x); } return path; } }
Standard input is empty
> Initial timings: Path from 1000000000 to 1: [1, 3, 3, 3, 3, 1, 3, 3, 1, 3, 1, 1, 3, 3, 3, 3, 1, 2, 2, 1, 3, 2, 1, 3, 3, 2, 1, 3, 2, 2] Path length was 30 Total time was about 12.855ms. Path from 999999995 to 1: [1, 2, 1, 2, 2, 1, 3, 2, 1, 3, 2, 2, 1, 1, 3, 3, 1, 3, 2, 2, 1, 3, 3, 2, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3] Path length was 34 Total time was about 4.643ms. > Timings after warmup: Path from 1000000000 to 1: [1, 3, 3, 3, 3, 1, 3, 3, 1, 3, 1, 1, 3, 3, 3, 3, 1, 2, 2, 1, 3, 2, 1, 3, 3, 2, 1, 3, 2, 2] Path length was 30 Total time was about 0.762ms. Path from 999999995 to 1: [1, 2, 1, 2, 2, 1, 3, 2, 1, 3, 2, 2, 1, 1, 3, 3, 1, 3, 2, 2, 1, 3, 3, 2, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3] Path length was 34 Total time was about 0.767ms.