using System; using System.Collections.Generic; using System.IO; using static System.Console; namespace komvo { class Program { public static List Points = new List(); static void Main(string[] args) { string file = "coord.txt"; using (StreamReader cr = new StreamReader(file)) { string line; while ((line = cr.ReadLine()) != null) { string[] str = line.Split(); Points.Add(new Point { X = int.Parse(str[0]), Y = int.Parse(str[1]) }); } } int matr = Points.Count; double[,] Matrix = new double[matr, matr]; foreach (Point p in Points) { WriteLine("{0} {1}", p.X, p.Y); } WriteLine(); for (int i = 0; i < Points.Count; i++) { for (int j = i; j < Points.Count - 1; j++) { Matrix[i, j + 1] = Math.Sqrt(Math.Pow(Points[j + 1].X - Points[i].X, 2) + Math.Pow(Points[j + 1].Y - Points[i].Y, 2)); Write("{0} {1} : {2:N2}\t", Points[i].X, Points[j + 1].X, Matrix[i, j]); } WriteLine(); } for (int i = 0; i < matr; i++) { for (int j = 0; j < matr; j++) Write("{0:00.00} ", Matrix[i, j]); WriteLine(); } string formP = string.Empty; for (int i = 2; i <= Points.Count; i++) formP += i.ToString(); WriteLine("{0} {1}", formP, Fact(Points.Count - 1)); WriteLine("\n\n"); int[] routes = new int[Fact(Points.Count - 1)]; double[] leng = new double[Fact(Points.Count - 1)]; int waves = 0; if (Points.Count == 4) waves = 1; else if (Points.Count == 5) waves = 4; else if (Points.Count == 6) waves = 20; int cn = 1, cn2 = 0; string inf = formP; for (int i = 1; i < waves + 1; i++) { for(int j = 0; j < 6; j++) { if (i == 0 && j == 0) { routes[j + (i - 1) * 6] = int.Parse(formP); WriteLine(routes[j + (i - 1) * 6]); } else if (j % 2 == 0) { routes[j + (i - 1) * 6] = int.Parse(formP = Swap(formP, 0, j / 2)); WriteLine(routes[j + (i - 1) * 6]); } else { routes[j + (i - 1) * 6] = int.Parse(Swap(formP, 1, 2)); WriteLine(routes[j + (i - 1) * 6]); } } if (waves > 1) { if (i % 4 == 0 && waves > 4) { formP = Swap(formP, cn2++, 4); WriteLine("{0} {1}", formP, inf); } else { switch (cn) { case 1: formP = Swap(formP, '2', '5'); cn++; break; case 2: formP = Swap(formP, '3', '2'); cn++; break; case 3: formP = Swap(formP, '4', '3'); cn++; break; default: WriteLine("???????"); break; } if (cn > 3) cn = 1; //formP = Swap(inf, cn++, 3); //WriteLine("{0} {1}", formP, inf); } //if (cn > 4) //{ // cn = 0; // formP = Swap(inf, cn2, 4); // cn2++; //} //else //{ //formP = Swap(inf, cn, 3); //} //cn++; } //routes[0] = int.Parse(formP); //routes[1] = int.Parse(Swap(formP, 1, 2)); //routes[2] = int.Parse(formP = Swap(formP, 0, 1)); //routes[3] = int.Parse(Swap(formP, 1, 2)); //routes[4] = int.Parse(formP = Swap(formP, 0, 2)); //routes[5] = int.Parse(Swap(formP, 1, 2)); } for (int i = 0; i < routes.Length; i++) { double res = 0; char[] ch = routes[i].ToString().ToCharArray(); for(int j = 0; j < ch.Length; j++) { if (j == 0) res += Matrix[0, 1]; else if (j == ch.Length - 1) { res += Matrix[int.Parse(ch[j - 1].ToString()) - 1, int.Parse(ch[j].ToString()) - 1]; res += Matrix[0, int.Parse(ch[j].ToString()) - 1]; } else { res += Matrix[int.Parse(ch[j - 1].ToString()) - 1, int.Parse(ch[j].ToString()) - 1]; } } leng[i] = res; } double optim = leng[0]; int oIndex = 0; for (int i = 0; i < leng.Length; i++) { WriteLine("{0:N2} - {1}", leng[i], routes[i]); if (optim > leng[i]) { optim = leng[i]; oIndex = i; } } for (int i = 0; i < routes.Length; i++) { for (int j = i + 1; j < routes.Length - 1; j++) if (routes[i].Equals(routes[j])) WriteLine("{0} {2}:: {1} {3}!!!!", routes[i], routes[j], i, j); } WriteLine("\n\n1{1}1 - оптимальный маршрут длинной {0:00.00}\nВсего маршрутов {2}\n{4} {3}", optim, routes[oIndex], routes.Length, Fact(Points.Count - 1), Points.Count); //WriteLine(Fact(5)); //MessageBox.Show(Math.Sqrt(-1).ToString()); ReadKey(); } public static string Swap(string value, int first, int second) { char[] res = value.ToCharArray(); res[first] = value[second]; res[second] = value[first]; value = new string(res); return value; } public static string Swap(string value, char first, char second) { int f, s; char[] res = value.ToCharArray(); WriteLine(f = value.IndexOf(first)); WriteLine(s = value.IndexOf(second)); res[value.IndexOf(first)] = value[value.IndexOf(second)]; res[value.IndexOf(second)] = value[value.IndexOf(first)]; value = new string(res); return value; } public partial struct Point { public int X { get; set; } public int Y { get; set; } } static int Fact(int a) => a <= 1 ? 1 : a * Fact(a - 1); } }