xeeeveee/sudoku

PHP 数独逻辑库 - 生成和解决数独谜题

0.2.1 2015-11-17 23:09 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:09:42 UTC


README

Build Status

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() 方法解决谜题非常简单,该方法将返回 truefalse,具体取决于结果,以下是一个示例:

    $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。 注意 - 生成谜题始终将解决方案重置为空网格。