|
|
|
using System;
|
|
|
|
using System.IO;
|
|
|
|
using System.Diagnostics;
|
|
|
|
using Combinatorics.Collections;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using static System.Console;
|
|
|
|
|
|
|
|
namespace komvo
|
|
|
|
{
|
|
|
|
class Program
|
|
|
|
{
|
|
|
|
public static List<Point> Points = new List<Point>();
|
|
|
|
public static List<string> Infinitives = new List<string>();
|
|
|
|
|
|
|
|
static void Main(string[] args)
|
|
|
|
{
|
|
|
|
Stopwatch stopwatch = new Stopwatch();
|
|
|
|
stopwatch.Start();
|
|
|
|
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]) });
|
|
|
|
WriteLine(str[0] + " " + str[1]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
WriteLine();
|
|
|
|
|
|
|
|
int matr = Points.Count;
|
|
|
|
double[,] Matrix = new double[matr, matr];
|
|
|
|
|
|
|
|
for (int i = 0; i < Points.Count; i++)
|
|
|
|
for (int j = i; j < Points.Count - 1; j++)
|
|
|
|
Matrix[i, j + 1] = Matrix[j + 1, i] =
|
|
|
|
Math.Sqrt(Math.Pow(Points[j + 1].X - Points[i].X, 2) + Math.Pow(Points[j + 1].Y - Points[i].Y, 2));
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < matr; i++)
|
|
|
|
{
|
|
|
|
for (int j = 0; j < matr; j++) Write("{0:00.00} ", Matrix[i, j]);
|
|
|
|
WriteLine();
|
|
|
|
}
|
|
|
|
|
|
|
|
int[] toSwap = new int[Points.Count - 1];
|
|
|
|
for (int i = 0; i <= toSwap.Length - 1; i++) toSwap[i] = i + 2;
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < toSwap.Length; i++) WriteLine(toSwap[i]);
|
|
|
|
|
|
|
|
int fct = Fact(Points.Count - 1);
|
|
|
|
|
|
|
|
int[] routes = new int[fct];
|
|
|
|
double[] leng = new double[fct];
|
|
|
|
|
|
|
|
double optim = leng[0];
|
|
|
|
int oIndex = 0;
|
|
|
|
|
|
|
|
Permutations<int> perm = new Permutations<int>(toSwap);
|
|
|
|
int index = 0;
|
|
|
|
foreach(IList<int> p in perm)
|
|
|
|
{
|
|
|
|
string res = string.Empty;
|
|
|
|
for (int i = 0; i < toSwap.Length; i++) res += p[i].ToString();
|
|
|
|
routes[index++] = int.Parse(res);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < routes.Length; i++) WriteLine(routes[i]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CountLen(ref leng, Matrix, routes);
|
|
|
|
SearchBest(ref optim, ref oIndex, routes, leng);
|
|
|
|
Debug(routes);
|
|
|
|
|
|
|
|
WriteLine("\n\n1{1}1 - оптимальный маршрут длинной {0:00.00}\nВсего маршрутов {2}\n{4} {3}",
|
|
|
|
optim, routes[oIndex], routes.Length, fct, Points.Count);
|
|
|
|
WriteLine(stopwatch.ElapsedMilliseconds + "ms");
|
|
|
|
stopwatch.Stop();
|
|
|
|
|
|
|
|
ReadKey();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void CountLen (ref double[] result, double[,] mtr, int[] rts)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < rts.Length; i++)
|
|
|
|
{
|
|
|
|
double res = 0;
|
|
|
|
char[] ch = rts[i].ToString().ToCharArray();
|
|
|
|
for (int j = 0; j < ch.Length; j++)
|
|
|
|
{
|
|
|
|
int db = int.Parse(ch[j].ToString()) - 1; //debug
|
|
|
|
string db1 = rts[i].ToString(); //debug
|
|
|
|
if (j == 0) res += mtr[0, int.Parse(ch[j].ToString()) - 1];
|
|
|
|
else if (j == ch.Length - 1)
|
|
|
|
{
|
|
|
|
res += mtr[int.Parse(ch[j - 1].ToString()) - 1, int.Parse(ch[j].ToString()) - 1];
|
|
|
|
res += mtr[0, int.Parse(ch[j].ToString()) - 1];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
res += mtr[int.Parse(ch[j - 1].ToString()) - 1, int.Parse(ch[j].ToString()) - 1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
result[i] = res;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void SearchBest(ref double optim, ref int oIndex, int[] routes, double[] leng)
|
|
|
|
{
|
|
|
|
optim = leng[0];
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void Debug (int[] routes)
|
|
|
|
{
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|