public async Task <IActionResult> OnGetAsync(Guid?id) { if (id == null) { return(NotFound()); } // Загрузка головоломки Puzzle = await _context.Puzzles .Include("Vessels") .Include("States") .FirstOrDefaultAsync(m => m.ID == id); // Проверка на существование объекта if (Puzzle == null) { return(NotFound()); } // Загрузка начального и конечного состояний State start = _context.GetState(id.Value, StateType.Start); State final = _context.GetState(id.Value, StateType.Final); // Список StartState = _context.StatesOfVessels.Where(a => a.State.ID == start.ID).ToList(); FinalState = _context.StatesOfVessels.Where(a => a.State.ID == final.ID).ToList(); return(Page()); }
public async Task <IActionResult> OnGetAsync(Guid?id) { if (id == null) { return(NotFound()); } // Моя головоломка Puzzle = await _context.Puzzles.FirstOrDefaultAsync(m => m.ID == id); if (Puzzle == null) { return(NotFound()); } // Решение головоломки // ------------------- // Загрузка начального и конечного состояний State start = _context.GetState(id.Value, StateType.Start); State final = _context.GetState(id.Value, StateType.Final); // Добавление ходов для начального состояния _context.AddMoves(start); Move move; move = _context.Moves.FirstOrDefault(a => a.ToState == null); while (move != null) { // Построение следующего состояния State newState = State.NextState(move); // Поиск нового состояния в базе State oldState = null; // Все сохраненные состояния этой головоломки foreach (var s in _context.States.Where(a => a.PuzzleID == id && a.SType == StateType.Intermediate).ToList()) { if (s == newState) { oldState = s; break; } } if (oldState != null) { // Состояние уже есть в базе move.ToState = oldState; } else { // Проверка на решение задачи if (newState == final) { newState.SType = StateType.Solution; } // Добавление в базу данных _context.States.Add(newState); _context.AddMoves(newState); } // Сохранение изменений _context.SaveChanges(); move = _context.Moves.FirstOrDefault(a => a.ToState == null); // решение найдено - выходим из цикла if (newState.SType == StateType.Solution) { break; } } // Построение матрицы для визуализации Matrix = new List <List <int> >(); foreach (var s in _context.States.Where(a => a.PuzzleID == id).OrderBy(a => a.SType).ToList()) { // Строка состояния для визуализации var list = s.StateOfVessels.OrderBy(a => a.Vessel.Number).Select(a => a.Value.HasValue ? a.Value.Value : -1).ToList(); Matrix.Add(list); } /* * State state = _context.GetState(id.Value, StateType.Solution); * // Строка состояния для визуализации * var list = state.StateOfVessels.Select(a => a.Value.Value).ToList(); * Matrix.Add(list); * * while (state.SType != StateType.Start) * { * // Переход к предыдущему состоянию * move = _context.Moves.FirstOrDefault(a => a.ToState.ID == state.ID); * state = move.FromState; * // Строка состояния для визуализации * list = state.StateOfVessels.Select(a => a.Value.Value).ToList(); * Matrix.Add(list); * } */ return(Page()); }