Недавно я хотел посмотреть, смогу ли я решить легкую судоку (сначала) в php. Я знаю, что php на самом деле не является выбором для программирования, но я знаю, что php лучший, и у меня были проблемы с дизайном в java и c. Тем не менее, я не вижу причин, почему это не должно работать.php easy sudoku solver using backtracking
Во-первых, я не хотел вас спрашивать, потому что там были некоторые разрешенные темы. Но я обнаружил, что эти решения слишком сложны для понимания (другие языки, сложные структуры) и из моей цели.
Мой вопрос: может ли кто-нибудь дать мне подсказку, основанную на моей цели? Я хочу простой решатель судоку, не догадываясь, просто с отступлением.
алгоритм выглядит следующим образом:
$cell; // 1-81 - as parameter of the recursive function solve()
$value; // 1-9 - as parameter ...
class Sudoku {
function solve($cell = 1, $value = 1) {
// skipping values
if the current cell is fix:
return solve(cell++, $value);
// testing values (logic)
if not:
if the value is within the square (3x3) itself:
return solve($cell, $value++);
if the value is within the row:
return solve($cell, $value++);
if the value is within the col:
return solve($cell, value++);
if the value is bigger than 9:
return solve($cell--, $value_prev);
// all test passed, add the new value to list
$this->values[$cell] = $value;
if all fields are filled:
return;
if there are fields left:
return solve($cell++, 1);
}
}
Если я создаю пустой судоку будет заполнить все правильно до ячейки 43. Там сценарий аварий с фатальной ошибки: фатальная ошибка: Разрешенные размер памяти 134217728 байт исчерпан (пытался выделить 261904 байта).
значения заполняются так:
1 2 3 | 4 5 6 | 7 8 9
4 5 6 | 7 8 9 | 1 2 3
7 8 9 | 1 2 3 | 4 5 6
2 1 4 | 3 6 5 | 8 9 7
3 6 5 | 2 1 4 | , , ,
Я думаю, что существует бесконечный цикл или что-то, что вызывает этот крах. Может быть, это не разрешимо. Я просто хотел узнать, поступаю ли я правильно или что я забыл проверить. Я также пробовал этот алгоритм с фиксированными значениями из easy-sudoku. Он тоже терпит крах ... возможно, есть много отступлений.
Наконец, я хочу сказать, что я не против лучших решений, но я просто хочу, чтобы это сработало. Если вы не можете дать мне ответ, основанный на этом вы можете посмотреть на файл PHP:
Edit: sudoku2.php
Спасибо заранее.
Он все еще не работает. Но я мог бы предотвратить сбой системы.Нет, я всегда получаю сообщение: «Не могу решить эту судоку». Кажется, мне понравилось, что ты сказал. Вы можете взглянуть на исходный код, который я написал выше? «Sudoku2.php». –
Теперь он работает ... Я забыл сбросить значение ячеек до 0 перед возвратом в предыдущую ячейку. Это делает трюк. –