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