Удаление ячеек из раствора судоку, чтобы сделать его головоломкойC#

Место общения программистов C#
Ответить
Anonymous
 Удаление ячеек из раствора судоку, чтобы сделать его головоломкой

Сообщение Anonymous »

Я пишу приложение 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»