Поиск кратчайшего пути - C# (181681)
Формулировка задачи:
В одном массиве даны все возможные комбинации чисел (0,1,2,3,4). Представляют собой города.
В другом массиве - расстояния между этими городами.
Решение задачи: «Поиск кратчайшего пути»
textual
Листинг программы
class Program
{
public static double[,] ArrayDistance;
static void Main(string[] args)
{
List<String> city=new List<string>();
String line = String.Empty;
do
{
Console.Clear();
Console.WriteLine("В списке {0} городов, введите название города: ",city.Count);
line = Console.ReadLine();
if(line!="")
city.Add(line);
} while (line!="");
if (city.Count < 3)
{
Console.Clear();
Console.WriteLine("В списке должно быть не менее трех городов!");
Console.ReadLine();
return;
}
ArrayDistance=new double[city.Count,city.Count];
ClearTo(ref ArrayDistance,-1);
for (int i = 0; i < city.Count; i++)
{
ArrayDistance[i, i] = 0;
}
for (int i = 0; i < city.Count; i++)
{
for (int j = 0; j < city.Count; j++)
{
if (ArrayDistance[i, j] == -1)
{
try
{
Console.Clear();
Console.WriteLine("Введите расстояние между {0} и {1}:",city[i],city[j]);
String dist = Console.ReadLine();
if (dist != null)
{
double distance = Double.Parse(dist);
ArrayDistance[i, j] = distance;
ArrayDistance[j, i] = distance;
}
}
catch (Exception)
{
Console.Clear();
Console.WriteLine("Вы ввели не правильное число. Работа программы прекращена.");
Console.ReadLine();
return;
}
}
}
}
Console.Clear();
Console.WriteLine("Ниже приведен список городов: ");
for (int i = 0; i < city.Count; i++)
{
Console.WriteLine("{0} - {1}",i,city[i]);
}
String count_route = (city.Count - 1).ToString();
Console.WriteLine("Выберите из какого города стартует маршрут (0-{0}) : ", count_route);
String from_string = Console.ReadLine();
Console.WriteLine("Выберите в какой город просчитать маршрут (0-{0}) : ",(city.Count-1));
String to_string = Console.ReadLine();
int from = 0;
int to = 0;
try
{
from = Int32.Parse(from_string);
to = Int32.Parse(to_string);
if(from>(city.Count-1) && to>(city.Count-1))
throw new Exception();
if (from == to)
{
Console.Clear();
Console.WriteLine("Расстояние между городами 0км.");
Console.ReadLine();
return;
}
}
catch (Exception)
{
Console.Clear();
Console.WriteLine("Вы ввели не правильное число. Работа программы прекращена.");
Console.ReadLine();
return;
}
Console.Clear();
Console.WriteLine("Поиск кратчайшего пути...");
double result=SearchShortWay(from,to,new List<int>());
Console.WriteLine("Растояние между {0} и {1} = {2}", city[from], city[to], result);
Console.ReadLine();
}
public static void ClearTo(ref double[,] array, int val)
{
for (int i = array.GetLowerBound(0); i <= array.GetUpperBound(0); i++)
{
for (int j = array.GetLowerBound(1); j <= array.GetUpperBound(1); j++)
{
array[i, j] = val;
}
}
}
public static double SearchShortWay(int index_from, int index_to, List<int> used_city)
{
double result = 0;
List<double> shortway=new List<double>();
for (int i = 0; i < ArrayDistance.GetLength(0); i++)
{
bool flag = false;
foreach (int index in used_city)
{
if (i == index)
flag = true;
}
if(flag)
continue;
if(i==index_from)
continue;
//List<int> used_city_temp=new List<int>();
if (i != index_to)
{
double part_way=ArrayDistance[index_from, i];
used_city.Add(index_from);
shortway.Add(part_way + SearchShortWay(i, index_to, used_city));
}
else
{
shortway.Add(ArrayDistance[index_to,index_from]);
}
}
result = shortway.Min();
return result;
}
}