using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace Dungeon;
public class BfsTask
{
public static IEnumerable<SinglyLinkedList<Point>>
FindPaths(Map map, Point start, Chest[] chests)
{
var queue = new Queue<SinglyLinkedList<Point>>();
queue.Enqueue(new SinglyLinkedList<Point>(start));
var vistedPoints = new HashSet<Point>();
vistedPoints.Add(start);
var pointChests = chests.Select(Chest => Chest.Location);
while (queue.Count != 0)
{
var item = queue.Dequeue();
for (var dy = -1; dy <= 1; dy++)
for (var dx = -1; dx <= 1; dx++)
{
if (dx != 0 && dy != 0) continue;
var point = new Point(item.Value.X + dx, item.Value.Y + dy);
if (point.X < 0 || point.X >= map.Dungeon.GetLength(0)
|| point.Y < 0 || point.Y >= map.GetLength(1)) continue;
if (map.Dungeon[point.X, point.Y] != MapCell.Empty) continue;
if (vistedPoints.Contains(point)) continue;
queque.Enqueque(new SinglyLinkedList<Point>(point, item));
if (pointChests.Contains(point))
yield return (new SinglyLinkedList<Point>(point, item));
}
vistedPoint.Add(item.Value);
}
}
}