5. 大地遊戲闖關

Console.Write("請輸入大地遊戲關卡文字檔檔名: ");
var f = Console.ReadLine();
Console.WriteLine("你輸入檔名為 '" + f + "'");
var txt = File.OpenText(AppDomain.CurrentDomain.BaseDirectory + "\\" + f).ReadToEnd();
Console.WriteLine($"大地遊戲關卡文字檔內容為:\n{txt}");

var data = txt.Split('\n');

int lvl = int.Parse(data[0]);
double[,] graph = new double[lvl, lvl];
for (int i = 1; i <= lvl; i++)
{
    var line = data[i].Split(' ');
    for (global::System.Int32 j = 0; j < line.Length; j++)
    {
        graph[i - 1, j] = double.Parse(line[j]);
    }
}

var v = data[data.Length - 1].Split(' ').Select(int.Parse).ToArray();
int from = v[0];
int to = v[1];

List<List<int>> levels = new List<List<int>>();
void run(int goal, List<int> lvls)
{
    var current = lvls.Last();
    if (current == goal)
    {
        levels.Add(lvls);
        return;
    }
    for (global::System.Int32 i = 0; i < lvl; i++)
    {
        var val = graph[current, i];
        if (val <= 0.0) continue;
        if (lvls.Contains(i)) continue;
        var clone = new List<int>(lvls);
        clone.Add(i);
        run(goal, clone);
    }
}
run(to - 1, new List<int>(new int[] { from - 1 }));

double fastestK = Double.MaxValue;
List<int> fastest = new List<int>();
foreach (var item in levels)
{
    double kv = 0;
    for (global::System.Int32 i = 1; i < item.Count; i++)
    {
        kv += graph[item[i - 1], item[i]];
    }
    if (kv < fastestK)
    {
        fastest = item;
        fastestK = kv;
    }
}

Console.WriteLine($"最快的闖關路線 [{from} -> {to}]: {string.Join("->", fastest.Select(r => r + 1))} (路途險峻程度 {fastestK})");

Last updated