|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.IO;
|
|
|
|
using static System.Console;
|
|
|
|
|
|
|
|
namespace komvo
|
|
|
|
{
|
|
|
|
class Program
|
|
|
|
{
|
|
|
|
public static List<Point> Points = new List<Point>();
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|