4. 最小路徑程式

List<List<int>> arr = new List<List<int>>();
Console.Write("請輸入一個二維陣列: ");
var str = Console.ReadLine();
for (int i = 1; i < str.Length - 1; i++)
{
    if (str[i] == '[')
    {
        var list = new List<int>();
        var end = str.IndexOf(']', i);
        var data = str.Substring(i + 1, end - i - 1);
        var v = data.Split(',');
        for (global::System.Int32 j = 0; j < v.Length; j++)
            list.Add(int.Parse(v[j]));

        i = end + 1;
        arr.Add(list);
    }
}

Console.WriteLine("數字地圖:");
for (int i = 0; i < arr.Count; i++)
{
    var k = arr[i];
    Console.Write("\t[");
    for (int j = 0; j < k.Count; j++)
    {
        Console.Write(k[j]);
        if (j != k.Count - 1) Console.Write(", ");
    }
    Console.WriteLine("]");
}

List<List<int>> paths = new List<List<int>>();
void run(int x, int y, List<int> current)
{
    if (y == arr.Count - 1 && x == arr[0].Count - 1)
    {
        current.Add(arr[arr.Count - 1][arr[0].Count - 1]);
        paths.Add(current);
        return;
    }
    var a = new List<int>(current);
    a.Add(arr[y][x]);

    if (y + 1 != arr.Count)
        run(x, y + 1, new List<int>(a));
    if (x + 1 != arr[0].Count)
        run(x + 1, y, a);
}
run(0, 0, new List<int>());

if (arr[0].Count + arr.Count < 8)
{
    Console.WriteLine("所有路徑:");
    foreach (var a in paths)
    {
        Console.WriteLine($"\t[{string.Join(", ", a)}]");
    }
}

int minLen = int.MaxValue;
List<int> path = null;
foreach (var item in paths)
{
    var sum = 0;
    foreach (var item1 in item)
    {
        sum += item1;
    }
    if (sum < minLen) minLen = sum;
    path = item;
}

Console.WriteLine($"最小路徑:  [{string.Join(", ", path)}]");
Console.WriteLine($"最小路徑和:  {minLen}");

Last updated