using System.Collections.Generic;
public static class PathFinderTask
public static int[] FindBestCheckpointsOrder(Point[] checkpoints)
var distance = double.PositiveInfinity;
var bestOrder = new int[checkpoints.Length];
var order = new int[checkpoints.Length];
MakeTrivialPermutation(checkpoints, order, ref bestOrder, 1, ref distance);
private static int[] MakeTrivialPermutation(Point[] checkpoints, int[] order,
ref int[] bestOrder,int p, ref double distance)
var curOrder = new int[p];
Array.Copy(order, curOrder, p);
var length = PointExtensions.GetPathLength(checkpoints, curOrder);
if ((length < distance) || (p == order.Length))
bestOrder = (int[])order.Clone();
for (int i = 1; i < order.Length; i++)
var index = Array.IndexOf(order, i, 0, p);
MakeTrivialPermutation(checkpoints, order, ref bestOrder, p + 1, ref distance);