@@ -290,6 +290,7 @@ <h2 id="problem-name">RAM Run</h2>
290290using System.Linq;
291291using System.Text.RegularExpressions;
292292using System.Numerics;
293+ using AngleSharp.Common;
293294
294295[ProblemName("RAM Run")]
295296class Solution : Solver {
@@ -316,27 +317,25 @@ <h2 id="problem-name">RAM Run</h2>
316317 int? Distance(IEnumerable<Complex> blocks) {
317318 // our standard priority queue based path finding
318319
319- var blockSet = blocks.ToHashSet();
320320 var size = 70;
321- var goal = size + size * Complex.ImaginaryOne;
321+ var (start, goal) = (0, size + size * Complex.ImaginaryOne);
322+ var blocked = blocks.Concat(start).ToHashSet();
323+
322324 var q = new PriorityQueue<Complex, int>();
323- q.Enqueue(0, 0);
324- var seen = new HashSet<Complex>(0);
325-
325+ q.Enqueue(start, 0);
326326 while (q.TryDequeue(out var pos, out var dist)) {
327327 if (pos == goal) {
328328 return dist;
329- } else {
330- foreach (var dir in new[] { 1, -1, Complex.ImaginaryOne, -Complex.ImaginaryOne }) {
331- var posT = pos + dir;
332- if (!seen.Contains(posT) &&
333- !blockSet.Contains(posT) &&
334- 0 <= posT.Imaginary && posT.Imaginary <= size &&
335- 0 <= posT.Real && posT.Real <= size
336- ) {
337- q.Enqueue(posT, dist + 1);
338- seen.Add(posT);
339- }
329+ }
330+
331+ foreach (var dir in new[] { 1, -1, Complex.ImaginaryOne, -Complex.ImaginaryOne }) {
332+ var posT = pos + dir;
333+ if (!blocked.Contains(posT) &&
334+ 0 <= posT.Imaginary && posT.Imaginary <= size &&
335+ 0 <= posT.Real && posT.Real <= size
336+ ) {
337+ q.Enqueue(posT, dist + 1);
338+ blocked.Add(posT);
340339 }
341340 }
342341 }
0 commit comments