/// <inheritdoc /> /// <exception cref="ArgumentNullException" /> public FinalAnswer Solve(Model model, IDirectTaskSolver checker) { _model = model; // ?? throw new ArgumentNullException(nameof(model)); var factory = new RailwayFactory(); // Разброс точек маршрута var routesSize = GetRoutesSize(model); // Создать стартовую трассу - кольцо var cycle = RailwayTemplates.CreateCircle(RailwayType.T4R); // Функция отображения модели void DisplayStep(IRailwayTemplate t) { _answer = t.ConvertToModel(_model); OnStepEvent?.Invoke(this, new FinalAnswer(_answer, checker.Solve(_answer))); } DisplayStep(cycle); var compass = RailwayTemplates.Compass(cycle); var l = 2; const int CYCLES_COUNT = 5; IRailwayTemplate head = cycle; for (var k = 0; k < CYCLES_COUNT; k++) { // Left for (var i = 0; i < l; i++) { if (!head.TryScale(Direction.E, Railway.L3)) { break; } DisplayStep(cycle); } // Up var chain1 = factory.BuildTemplate("t2T1L6", model); head.TryMutate(chain1); DisplayStep(cycle); // Up for (var i = 0; i < l; i++) { if (!chain1.TryScale(Direction.N, Railway.L3)) { break; } DisplayStep(cycle); } // Right var chain2 = factory.BuildTemplate("t2T1L6", model); chain1.TryMutate(chain2); DisplayStep(cycle); l += 3; // Right for (var i = 0; i < l; i++) { if (!chain2.TryScale(Direction.W, Railway.L3)) { break; } DisplayStep(cycle); } // Down var chain3 = factory.BuildTemplate("t2T1L6", model); chain2.TryMutate(chain3); DisplayStep(cycle); // Down for (var i = 0; i < l; i++) { if (!chain3.TryScale(Direction.S, Railway.L3)) { break; } DisplayStep(cycle); } // Right var chain4 = factory.BuildTemplate("t2T1L6", model); chain3.TryMutate(chain4); DisplayStep(cycle); head = chain4; l += 3; } // Первый этап - расширяем кольцо вверх, вниз и в сторону /* * const int count = 16; * for (var i = 0; i < count; i++) * { * // Блок, к которому добавляем L1 * var dest = compass.W; * * // Расширение по сторонам * if (i < count / 4) dest = compass.W; * //else if (i < 2 * count / 4) dest = compass.NW; * else if (i < 3 * count / 4) dest = compass.N; * //else if (i < 4 * count / 4) dest = compass.NE; * * // Чередование расширений по сторонам * //if (i % 4 == 0) dest = compass.W; * //else if (i % 4 == 1) dest = compass.NW; * //else if (i % 4 == 2) dest = compass.N; * //else if (i % 4 == 3) dest = compass.NE; * * var chain = new RailwayChain(new[] * { * new Railway(RailwayType.T8L), * new Railway(RailwayType.T8R), * }); * //dest.AppendSymmetric(chain); * * dest.AppendSymmetric(Railway.L1); * * DisplayStep(cycle); * } */ return(new FinalAnswer { Model = _answer, Price = checker.Solve(_answer), }); }
/// <summary> /// Вызвать изменение размера /// в указанном или любом направлении /// </summary> /// <param name="item">Шаблон масштабирования</param> /// <param name="direction">Направление</param> /// <param name="template">Шаблон для вставки. Если null - то вставить любой блок</param> /// <returns>True - если получилось, иначе - false</returns> public static bool TryScale(this IRailwayTemplate item, Direction direction, IRailwayTemplate template = null) { return(item.TryScale(direction.ToAngle(), template)); }