Я пишу приложение Sudoku и в настоящее время работаю над алгоритмом генерации игр. Мне удалось выяснить, как быстро генерировать решение (не решить). Однако я наткнулся на то, как удалить некоторые числа, чтобы фактически превратить их в головоломку. Мой первый склонность состояла в том, чтобы случайным образом удалить определенное количество ячеек на основе сложности, но это не правильный алгоритм, потому что он часто делает головоломку, которая является неразрешимой или имеет несколько решений. Это также может генерировать головоломки, которые не отражают запрошенную сложность. < /P>
Вот код, который у меня есть до сих пор. Я удалил большую часть нерелевантного кода, но если вы хотите увидеть что -то, что не реализовано, но используется ниже, пожалуйста, дайте мне знать. Я также могу дать свою попытку принять метод головоломки < /code>, если вы хотите, но я выбрал немедленно публиковать его, так как он явно неправильно (даже если это «работает»). < /P>
using System;
using System.Collections.Generic;
using System.Linq;
namespace Sudoku
{
public class Game
{
public enum Difficulty
{
VeryEasy,
Easy,
Medium,
Difficult,
Evil
}
private readonly int?[,] _currentItems = new int?[9,9];
private readonly int?[,] _solution = new int?[9,9];
private readonly int?[,] _startingItems = new int?[9,9];
private readonly Difficulty _difficulty;
public Game(Difficulty difficulty)
{
_difficulty = difficulty;
GenerateSolution();
Puzzlefy();
}
private void GenerateSolution()
{
var random = new Random();
var availableNumbers = new Stack(81);
var x = 0;
var y = 0;
availableNumbers.Push(AllowableNumbers(_solution, 0, 0).ToList());
while (x < 9 && y < 9)
{
var currentAvailableNumbers = AllowableNumbers(_solution, x, y).ToList();
availableNumbers.Push(currentAvailableNumbers);
// back trace if the board is in an invalid state
while (currentAvailableNumbers.Count == 0)
{
_solution[x, y] = null;
availableNumbers.Pop();
currentAvailableNumbers = availableNumbers.Peek();
x -= y >= 1 ? 0 : 1;
y = y >= 1 ? y - 1 : 8;
}
var index = random.Next(currentAvailableNumbers.Count);
_solution[x, y] = currentAvailableNumbers[index];
currentAvailableNumbers.RemoveAt(index);
x += y < 8 ? 0 : 1;
y = y < 8 ? y + 1 : 0;
}
}
private void Puzzlefy()
{
CopyCells(_solution, _startingItems);
// remove some stuff from _startingItems
CopyCells(_startingItems, _currentItems);
}
}
}
< /code>
Я не ищу код, скорее алгоритм. Как я бы удалил числа из решения, чтобы превратить их в головоломку?
Подробнее здесь: https://stackoverflow.com/questions/148 ... t-a-puzzle