- Сообщения
- 8,673
- Репутация
- 2,486
Надеюсь не нужно объяснять что такое игра Sudoku?
Пытался сам создать алгоритм построения сетки 9x9, так чтобы в горизонтальной линий, в вертикальной линий, и в каждом блоке 3x3, цифры от 1 до 9 не повторялись.
Но самому не удалось это осилить (у меня код переваливал за 100 строк, и это меня навело на мысль, что я в корне задачу решаю неправильно), и я всё таки открыл гугель и получил ответ в wikipedia. Там приведён пример на java, перевёл я это дело на AutoIt:
Всё отлично работает, но оно постоянно генерирует одну и туже таблицу, т.ч нужно сделать случайную генерацию, иначе нет смысла в одинаковых таблицах.
У кого какие будут мысли по теме?
Добавлено:
Вот как то ещё так я пытался:
:wacko:
Добавлено:
Оказывается генерировать случайные цифры и не нужно, достаточно можно случайным образом отсеивать “ненужные” ячейки:
но случайная генерация всё же нужна, чтобы сохранить разновидность таблиц, и чтобы таблица не имела способность “запоминаться”.
Пытался сам создать алгоритм построения сетки 9x9, так чтобы в горизонтальной линий, в вертикальной линий, и в каждом блоке 3x3, цифры от 1 до 9 не повторялись.
Но самому не удалось это осилить (у меня код переваливал за 100 строк, и это меня навело на мысль, что я в корне задачу решаю неправильно), и я всё таки открыл гугель и получил ответ в wikipedia. Там приведён пример на java, перевёл я это дело на AutoIt:
Код:
#include <Array.au3>
$n = 3
Dim $field[$n * $n][$n * $n]
For $i = 0 To ($n * $n) - 1
For $j = 0 To ($n * $n) - 1
$field[$i][$j] = Int(Mod(($i * $n + $i / $n + $j), ($n * $n)) + 1)
Next
Next
_ArrayDisplay($field)
Всё отлично работает, но оно постоянно генерирует одну и туже таблицу, т.ч нужно сделать случайную генерацию, иначе нет смысла в одинаковых таблицах.
У кого какие будут мысли по теме?
Добавлено:
Сообщение автоматически объединено:
Вот как то ещё так я пытался:
Код:
#include <Array.au3>
Global $n = 3
Global $field[$n * $n][$n * $n]
For $x = 0 To 8
For $y = 0 To 8
_SetCell($x, $y)
Next
Next
_ArrayDisplay($field)
Func _SetCell($x, $y)
$field[$x][$y] = Random(1, 9, 1)
While 1
For $i = 0 To ($n * $n) - 1
If $i <> $x And $field[$i][$y] = $field[$x][$y] Then
$field[$x][$y] = Random(1, 9, 1)
ContinueLoop 2
EndIf
Next
ExitLoop
WEnd
While 1
For $i = 0 To ($n * $n) - 1
If $i <> $y And $field[$x][$i] = $field[$x][$y] Then
$field[$x][$y] = Random(1, 9, 1)
ContinueLoop 2
EndIf
Next
ExitLoop
WEnd
If Mod($x, 3) = 0 Then
;Check the 3x3 block
EndIf
EndFunc
:wacko:
Добавлено:
Сообщение автоматически объединено:
Код:
#include <Array.au3>
$aSudoku_Fields = _Sudoku_GetFields(3, 6)
_ArrayDisplay($aSudoku_Fields)
Func _Sudoku_GetFields($nCels = 3, $iLevel = 6)
Local $aFields[$nCels * $nCels][$nCels * $nCels]
For $i = 0 To ($nCels * $nCels) - 1
For $j = 0 To ($nCels * $nCels) - 1
$aFields[$i][$j] = Int(Mod(($i * $nCels + $i / $nCels + $j), ($nCels * $nCels)) + 1)
Next
Next
For $i = 0 To $iLevel * Random(6, ($nCels * $nCels) - 1, 1)
$aFields[Random(0, ($nCels * $nCels) - 1, 1)][Random(0, ($nCels * $nCels) - 1, 1)] = ""
Next
Return $aFields
EndFunc
но случайная генерация всё же нужна, чтобы сохранить разновидность таблиц, и чтобы таблица не имела способность “запоминаться”.