Exemplo n.º 1
0
        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());
        }