Beispiel #1
0
 public DP2(int n1, int n2, MergeOp <T> mergeOp)
 {
     this.n1 = n1;
     this.n2 = n2;
     MergeOp = mergeOp;
     a       = Array.ConvertAll(new bool[n1], _ => Array.ConvertAll(new bool[n2], __ => mergeOp.V0));
 }
Beispiel #2
0
    static void Main()
    {
        var(h, w)   = Read2();
        var(ti, tj) = Read2();
        var sv = (ti - 1, tj - 1);

        (ti, tj) = Read2();
        var gv = (ti - 1, tj - 1);
        var c  = Array.ConvertAll(new bool[h], _ => Console.ReadLine());

        var dp = new DP2 <int>(h, w, MergeOp.Min(1 << 30));

        dp[sv] = 0;
        dp.AddTransition(p =>
        {
            if (c[p.i][p.j] == '#')
            {
                return;
            }
            var nv = p.Value + 1;
            p.Move(-1, 0).Merge(nv);
            p.Move(1, 0).Merge(nv);
            p.Move(0, -1).Merge(nv);
            p.Move(0, 1).Merge(nv);
        });

        for (int k = 0; k < h * w; k++)
        {
            dp.Execute(0, h, 0, w);
        }
        Console.WriteLine(dp[gv]);
    }
Beispiel #3
0
    static void Main()
    {
        var n  = 9;
        var dp = new DP3 <int>(n, n, 4, MergeOp.Min());

        dp[n / 2][n / 2][0] = 0;

        dp.AddTransition(p =>
        {
            if (p.Value == int.MaxValue)
            {
                return;
            }
            var nv = p.Value + 1;

            p.Move(0, 0, -3).Merge(nv);
            p.Move(0, 0, -1).Merge(nv);
            p.Move(0, 0, 1).Merge(nv);
            p.Move(0, 0, 3).Merge(nv);

            switch (p.k)
            {
            case 0:
                p.Move(1, 0).Jump(nk: 1).Merge(nv);
                p.Move(1, 0).Jump(nk: 2).Merge(nv);
                p.Move(0, 1).Jump(nk: 2).Merge(nv);
                p.Move(0, 1).Jump(nk: 3).Merge(nv);
                p.Move(1, 1).Jump(nk: 2).Merge(nv);
                break;

            case 1:
                p.Move(-1, 0).Jump(nk: 0).Merge(nv);
                p.Move(-1, 0).Jump(nk: 3).Merge(nv);
                p.Move(0, 1).Jump(nk: 2).Merge(nv);
                p.Move(0, 1).Jump(nk: 3).Merge(nv);
                p.Move(-1, 1).Jump(nk: 3).Merge(nv);
                break;

            case 2:
                p.Move(-1, 0).Jump(nk: 0).Merge(nv);
                p.Move(-1, 0).Jump(nk: 3).Merge(nv);
                p.Move(0, -1).Jump(nk: 0).Merge(nv);
                p.Move(0, -1).Jump(nk: 1).Merge(nv);
                p.Move(-1, -1).Jump(nk: 0).Merge(nv);
                break;

            case 3:
                p.Move(1, 0).Jump(nk: 1).Merge(nv);
                p.Move(1, 0).Jump(nk: 2).Merge(nv);
                p.Move(0, -1).Jump(nk: 0).Merge(nv);
                p.Move(0, -1).Jump(nk: 1).Merge(nv);
                p.Move(1, -1).Jump(nk: 1).Merge(nv);
                break;

            default:
                break;
            }
        });

        for (int k = 0; k < n * n; k++)
        {
            dp.Execute(0, n, 0, n, 0, 4);
        }

        using (var writer = File.CreateText("D0.txt"))
        {
            var rn = Enumerable.Range(0, n).ToArray();
            for (int k = 0; k < 4; k++)
            {
                for (int j = n - 1; j >= 0; j--)
                {
                    writer.WriteLine(string.Join("", rn.Select(i => dp[i, j, k] % 10)));
                }
                writer.WriteLine();
            }
        }
    }