Program.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. namespace ConsoleApp2 // Note: actual namespace depends on the project name.
  2. {
  3. internal class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. while (true)
  8. {
  9. Console.WriteLine("Для начала работы введиите 1");
  10. Console.WriteLine("Для завершения работы введиите 2");
  11. Console.WriteLine("Для начала работы с ручным вводом значений введиите 3");
  12. int f = Convert.ToInt32(Console.ReadLine());
  13. bool v = false;
  14. switch (f)
  15. {
  16. case 1:
  17. double[,] vs = {
  18. //{0,15,26,52,29,24},
  19. //{13,0,28,28,19,15},
  20. //{24,13,0,14,19,30},
  21. //{46,55,35,0,20,65},
  22. //{23,15,15,28,0,40},
  23. //{35,16,14,10,12,0 }
  24. {0,1,2,3,5},
  25. {1,0,4,4,3},
  26. {2,4,0,1,2},
  27. {7,4,1,0,3},
  28. {5,3,2,3,0}
  29. // {0,15,12,24,19},
  30. //{6,0,25,30,50},
  31. //{25,15,0,12,15},
  32. //{20,10,10,0,15},
  33. //{15,20,10,11,0}
  34. };
  35. int g = 5;
  36. resh(vs, g);
  37. break;
  38. case 2:
  39. v = true;
  40. break;
  41. case 3:
  42. Console.WriteLine("Введите размерность:");
  43. int g1 = 3;
  44. g1 = Convert.ToInt32(Console.ReadLine());
  45. double[,] vs1 = new double[g1, g1];
  46. for (int i = 0; i < g1; i++)
  47. {
  48. for (int j = 0; j < g1; j++)
  49. {
  50. vs1[i, j] = Convert.ToDouble(Console.ReadLine());
  51. }
  52. }
  53. resh(vs1, g1);
  54. break;
  55. }
  56. if (v)
  57. {
  58. break;
  59. }
  60. }
  61. }
  62. public static void resh(double[,] vs, int g)
  63. {
  64. List<List<int>> f1 = new List<List<int>>();
  65. List<double> t = new List<double>();
  66. for (int n = 0; g != n; n++)
  67. {
  68. List<List<int>> f = new List<List<int>>();
  69. List<int> list = new List<int>();
  70. f.Clear();
  71. f.Add(list);
  72. list.Add(n);
  73. while (f[0].Count <= g)
  74. {
  75. List<List<int>> z = new List<List<int>>();
  76. for (int k = 0; k < f.Count; k++)
  77. {
  78. List<int> listic = new List<int>();
  79. for (int i = 0; i < g; i++)
  80. {
  81. listic.Add(i);
  82. }
  83. for (int i = f[k].Count - 1; i >= 0; i--)
  84. {
  85. listic.Remove(f[k][i]);
  86. }
  87. double max = double.MaxValue;
  88. List<int> vs1 = new List<int>();
  89. for (int i = 0; i < listic.Count; i++)
  90. {
  91. if (f[k].Last() == listic[i])
  92. {
  93. continue;
  94. }
  95. double kl = vs[f[k].Last(), listic[i]];
  96. if (max >= kl)
  97. {
  98. max = kl;
  99. vs1.Add(listic[i]);
  100. }
  101. }
  102. z.Add(new List<int>(vs1.ToArray()));
  103. }
  104. bool ret = true;
  105. int x = f.Count;
  106. for (int k = 0; k < x; k++)
  107. {
  108. if (f[k].Count == g)
  109. {
  110. f[k].Add(f[k].First());
  111. continue;
  112. }
  113. for (int i = 0; i < z[k].Count - 1; i++)
  114. {
  115. if (z[k].Count == 0)
  116. {
  117. continue;
  118. }
  119. if (vs[f[k].Last(), z[k][i]] == vs[f[k].Last(), z[k].Last()])
  120. {
  121. f.Add(new List<int>(f[k].ToArray()));
  122. f[f.Count - 1].Add(z[k][i]);
  123. }
  124. }
  125. f[k].Add(z[k].Last());
  126. }
  127. }
  128. for (int i = 0; i < f.Count; i++)
  129. {
  130. double fun = 0;
  131. for (int h = 0; h < f[i].Count - 1; h++)
  132. {
  133. fun += vs[f[i][h], f[i][h + 1]];
  134. }
  135. t.Add(fun);
  136. }
  137. for (int i = 0; i < f.Count; i++)
  138. {
  139. f1.Add(f[i]);
  140. }
  141. }
  142. for (int i = 0; i < f1.Count; i++)
  143. {
  144. for (int j = 0; j < f1[i].Count; j++)
  145. {
  146. Console.Write(f1[i][j] + 1);
  147. }
  148. Console.WriteLine(" Длинна маршрута = " + t[i]);
  149. }
  150. List<int> fi = new List<int>();
  151. for (int i = 0; i < f1.Count - 1; i++)
  152. {
  153. if (t[i] == t.Min())
  154. {
  155. fi.Add(i);
  156. }
  157. }
  158. Console.WriteLine();
  159. Console.WriteLine();
  160. Console.WriteLine("Самый короткий маршрут");
  161. for (int i = 0; i < fi.Count; i++)
  162. {
  163. for (int j = 0; j < f1[i].Count; j++)
  164. {
  165. Console.Write(f1[fi[i]][j] + 1);
  166. }
  167. Console.WriteLine(" Длинна маршрута = " + t[fi[i]]);
  168. }
  169. }
  170. }
  171. }