xeeeveee / sudoku
PHP 数独逻辑库 - 生成和解决数独谜题
Requires (Dev)
- codeception/codeception: *
- guzzlehttp/guzzle: 5.3.*
This package is not auto-updated.
Last update: 2024-09-14 18:09:42 UTC
README
PHP 数独生成器和求解器
PHP 数独生成器和求解器,通过暴力回溯算法实现。
安装
使用 composer 安装 php composer require xeeeveee/sudoku:*
使用方法
TL;DR 完整示例
// Generate a new puzzle $puzzle = new Xeeeveee\Sudoku\Puzzle(); $puzzle->generatePuzzle(); $puzzle = $puzzle->getPuzzle(); // Solve a pre-determined puzzle $puzzle = new Xeeeveee\Sudoku\Puzzle($puzzle); $puzzle->solve(); $solution = $puzzle->getSolution(); // Check a puzzle is solvable $puzzle = new Xeeeveee\Sudoku\Puzzle(); $puzzle->setPuzzle($puzzle); $solvable = $puzzle->isSolvable(); // Check a puzzle is solved $puzzle = new Xeeeveee\Sudoku\Puzzle(); $puzzle->setPuzzle($puzzle); $puzzle->solve($puzzle); $solved = $puzzle->isSolved(); // Generate a puzzle with a different cell size $puzzle = new Xeeeveee\Sudoku\Puzzle(); $puzzle->setCellSize(5); // 25 * 25 grid $puzzle->generatePuzzle(); // Setting properties in the constructor $puzzle = new Xeeeveee\Sudoku\Puzzle($cellSize, $puzzle, $solution);
生成器
初始化一个实例后,可以通过调用以下 generatePuzzle()
方法生成一个新的数独谜题:
$puzzle = new Xeeeveee\Sudoku\Puzzle(); $puzzle->generatePuzzle();
您还可以通过传递一个介于 0 和谜题中最大单元格数(对于 3x3 的 $cellSize
为 81)之间的整数来指定生成谜题的难度。这表示将有多少个单元格在谜题中预先填充。例如,以下片段应生成一个有 25 个单元格预先填充的谜题。
$puzzle = new Xeeeveee\Sudoku\Puzzle(); $puzzle->generatePuzzle(25);
求解器
通过在对象上调用 solve()
方法解决谜题非常简单,该方法将返回 true
或 false
,具体取决于结果,以下是一个示例:
$puzzle = new Xeeeveee\Sudoku\Puzzle(); $puzzle->generatePuzzle(25); $puzzle->solve();
您可以使用 isSolved()
方法检查对象是否包含已解决的解决方案,并使用 getSolution
方法检索数组,一个更完整的示例可能如下所示:
$puzzle = new Xeeeveee\Sudoku\Puzzle(); $puzzle->generatePuzzle(25); if($puzzle->isSolvable() && $puzzle->isSolved() !== true) { $puzzle->solve(); } $solution = $puzzle->getSolution();
谜题和解决方案格式
标准($cellSize
3)谜题和解决方案表示为三维数组,实际上为 9($cellSize
* $cellSize
)行,每行有相同数量的列。空白值表示为 0
。一个完整的空($cellSize
3)谜题或解决方案的定义如下:
$puzzle = [ [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], ];
性能提示
由于生成和解决谜题所使用的算法的性质,这些命令的执行时间会随着使用的 $cellSize
的增加而呈指数增长,使用超过 4 的 $cellSize
的谜题平均需要特别长的时间来解决。
可用方法
整数 getCellSize()
返回谜题的单元格大小。
布尔值 setCellSize()
设置谜题的单元格大小。注意 - 这将重置对象上的 $puzzle
和 $solution
属性。
整数 getGridSize()
返回谜题的单元格大小。注意 - 这是基于 $cellSize
属性计算得出的。
数组 getPuzzle()
返回谜题数组。
布尔值 setPuzzle(array $puzzle = [])
设置谜题数组 - 如果省略了 $puzzle
参数或传递了无效的数组结构,则将生成一个空网格并返回 false。注意 - 设置谜题始终将解决方案重置为空网格。
数组 getSolution()
返回解决方案数组。
布尔值 setSolution(array $solution)
设置解决方案,如果提供的 $solution
参数格式无效,则返回 false 并不修改解决方案。
布尔值 solve()
尝试解决谜题。
布尔值 isSolved()
如果当前谜题的解决方案有效,则返回 true。
布尔值 isSolvable()
如果谜题可解,则返回 true - 这比实际解决谜题快得多。
布尔值 generatePuzzle($cellCount = 15)
生成一个新的谜题,$cellCount
参数指定预填充多少个单元格,从而有效控制难度。如果 $cellCount
的值是 0 - 81 之间的任何值,则是有效的;如果提供任何其他值,则返回 false。 注意 - 生成谜题始终将解决方案重置为空网格。