Exemple #1
0
        //Эта функция решает задачу, когда найдены доступные решения, отсортированы, отфильтрованы
        public KenKenBoard Solve(KenKenBoard board)
        {
            //Есть ли в списке регионы
            if (!AllRegions.Any())
            {
                return(board);
            }

            //Берем один регион
            var region = AllRegions[0];


            //Берем его клетки
            var cells = region.Cells;

            //Проходим через все возможные решения для данного региона
            foreach (var solution in region.Solutions)
            {
                //Проходим по каждому отдельному предлагаемому значению
                for (int i = 0; i < solution.Count; i++)
                {
                    //Пробуем расположить данное значение на поле
                    board.TryPlace(cells[i], solution[i]);
                }

                //Отфильтруем доску с данным решением
                var newProb = Prune(board);


                //Если полученное решенное задание не пустое
                if (newProb != null)
                {
                    newProb.Sort();

                    //Рекурсивно продолжаем искать решения для следующих областей
                    var ret = newProb.Solve(board);
                    if (ret != null)
                    {
                        return(ret);
                    }
                }

                //Если вышло так, что алгоритм не смог найти подходящее решение
                //То все, что осталось от него на доске, очищаем
                foreach (Point p in cells)
                {
                    board.UnsetPlace(p);
                }
            }


            return(null);
        }
Exemple #2
0
        //Функция генерации решений, подготавливает почву для решения задачи
        public KenKenBoard Solve()
        {
            //Проверка всех клеток на причастие к региону
            for (int x = 0; x < Constants.MapSize; x++)
            {
                for (int y = 0; y < Constants.MapSize; y++)
                {
                    if (Regions[x, y] != null)
                    {
                        //Если все ок, то побавляем данную клетку к списку клеток региона
                        Regions[x, y].Cells.Add(new Point(x, y));
                    }
                }
            }

            //Генерируем решения для всех регионов
            for (int x = 0; x < Constants.MapSize; x++)
            {
                for (int y = 0; y < Constants.MapSize; y++)
                {
                    Regions[x, y].GenerateSolutions();
                }
            }

            //Когда варианты ответов сгенерированы

            //Создаем словарь регионов
            var regions = new Dictionary <Region, int>();

            //Временная переменная
            Region tempSub;

            //Проходимся по всему игровому полю
            for (int x = 0; x < Constants.MapSize; x++)
            {
                for (int y = 0; y < Constants.MapSize; y++)
                {
                    //Передаем во временную переменную регион на данных координатах
                    tempSub = Regions[x, y];

                    //Если такого региона нет в словаре
                    if (!regions.ContainsKey(tempSub))
                    {
                        //То доабвляем его
                        regions.Add(tempSub, tempSub.Cells.Count);
                    }
                }
            }

            //!!!!!!!!!!!!!
            //Проходимся по списку регионов
            foreach (var val in regions.Keys)
            {
                //Отбрасываем невозможные решения

                //Для этого проходимся по всем возможным
                foreach (var solution in new List <List <int> >(val.Solutions))
                {
                    //Временная переменная для хранения игрового поля на данный момент
                    var tempBoard = new KenKenBoard();
                    //Смотрим все доступные решения
                    for (int i = 0; i < solution.Count; i++)
                    {
                        //Тут что-то идет не так
                        //
                        //
                        //
                        //
                        Console.Write("\n" + solution[i]);
                        //Если при попытке расопложить такое значение в данном положении не вышло
                        if (!tempBoard.TryPlace(val.Cells[i], solution[i]))
                        {
                            //То такое решение удаляем и выходим. Оно точно не будет использоваться
                            val.Solutions.Remove(solution);
                            break;
                        }

                        //
                        //
                        //
                    }
                }

                //После фильтрации этого региона, добавляем его к списку регионов
                AllRegions.Add(val);
            }

            Sort();

            //Пробуем решить задачу с полученными ресурсами, передаем пустое поле
            return(Solve(new KenKenBoard()));
        }