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)); }
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]); }
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(); } } }