6. 派屈網路的模擬

Dictionary<string, List<string>> nodeToStick = new();
Dictionary<string, int> cnt = new();
Dictionary<string, string?> stickToNode = new();


Console.WriteLine("輸入 輸入小圓盤 的數目及名稱:");
Console.ReadLine().Split(" ")[1..].ToList().ForEach(e =>
{
    nodeToStick[e] = [];
    cnt[e] = 0;
});

Console.WriteLine("輸入 內部小圓盤 的數目及名稱:");
Console.ReadLine().Split(" ")[1..].ToList().ForEach(e =>
{
    nodeToStick[e] = [];
    cnt[e] = 0;
});

Console.WriteLine("輸入 輸出小圓盤 的數目及名稱:");
Console.ReadLine().Split(" ")[1..].ToList().ForEach(e =>
{
    nodeToStick[e] = [];
    cnt[e] = 0;
});

Console.WriteLine("輸入 2-1轉移棒 的名稱及小圓盤的名稱:");
while (true)
{
    var k = Console.ReadLine().Split(" ");
    stickToNode[k[0]] = k[3];
    nodeToStick[k[1]].Add(k[0]);
    nodeToStick[k[2]].Add(k[0]);
    Console.Write("Continue?(1/0):");
    if (Console.ReadLine() == "0") break;
}

Console.WriteLine("輸入 1-1轉移棒 的名稱及小圓盤的名稱:");
while (true)
{
    var k = Console.ReadLine().Split(" ");
    stickToNode[k[0]] = k[2];
    nodeToStick[k[1]].Add(k[0]);
    Console.Write("Continue?(1/0):");
    if (Console.ReadLine() == "0") break;
}

Console.Write("轉移棒與小圓盤的關係:");
foreach (var item in stickToNode)
{
    Console.Write($"{item.Key}: {string.Join(" ",
        nodeToStick.ToList()
        .FindAll(e => e.Value.Contains(item.Key))
        .Select(e => e.Key)
        )} {item.Value} ");
}
Console.WriteLine("\n小圓盤與轉移棒的關係:");
foreach (var item in nodeToStick)
{
    Console.Write($"{item.Key}: {stickToNode
        .ToList().Find(e => e.Value == item.Key).Key} {string.Join(" ", item.Value)} ");
}
Console.WriteLine();

while (true)
{
    Console.Write("鍵入將放權杖的小圓盤名稱:");
    var n = Console.ReadLine();
       cnt[n]++;
 Console.Write("查看各個小圓盤權杖的情況:");
    foreach (var item in cnt)
    {
        Console.Write($"{item.Key}: {item.Value} ");
    }
    Console.WriteLine();


    while (true)
    {
        bool con = false;
        foreach (var stick in stickToNode)
        {
            var from = nodeToStick.ToList().FindAll(
                e => e.Value.Contains(stick.Key));
            if (from
                .Select(e => cnt[e.Key])
                .All(e => e == 1))
            {
                foreach (var item in from)
                {
                    cnt[item.Key]--;
                }
                cnt[stick.Value]++;
                con = true;
                break;
            }
        }
        if (con) continue;
        break;
    }

    Console.WriteLine("執行轉移棒.");
    Console.Write("查看各個小圓盤權杖的情況:");
    foreach (var item in cnt)
    {
        Console.Write($"{item.Key}: {item.Value} ");
    }
    Console.WriteLine();

    Console.Write("Continue?(1/0):");
    if (Console.ReadLine() == "0") break;
}

Last updated