我正在用 PHP 编写一个算法来解决给定的数独难题。我已经设置了一个带有两个类的面向对象的实现:Square
9x9 棋盘上每个单独图块的类,以及Sudoku
类,其矩阵为Square
s 代表董事会。
我正在使用的算法的实现是一种三层方法。第一步,仅解决最基本的难题(但也是最有效的),是根据棋盘的初始设置填充只能取单个值的任何方格,并相应地调整其余部分的约束未解的方块。
通常,这种“不断传播”的过程并不能完全解决棋盘问题,但它确实解决了相当大的问题。然后第二层将启动。它解析每个单元(或 9 个方格,它们必须全部具有唯一的数字分配,例如行或列),以获取每个未解方格的“可能”值。该可能值的列表在中表示为字符串Square
class:
class Square {
private $name; // 00, 01, 02, ... , 86, 87, 88
private $peers; // All squares in same row, col, and box
private $number; // Assigned value (0 if not assigned)
private $possibles; // String of possible numbers (1-9)
public function __construct($name, $p = 0) {
$this->name = $name;
$this->setNumber($p);
if ($p == 0) {
$this->possibles = "123456789";
}
}
// ... other functions
给定一个单元中未解决的正方形的整个数组(如上面第二层中所述),第二层将把所有“可能”的字符串连接成一个字符串。然后,它将在该单个字符串中搜索任何唯一的字符值 - 不重复的值。这将表明,在平方单位内,只有一个平方可以呈现该特定值。
我的问题是:为了实现第二层,如何解析一个单元中所有可能值的字符串并轻松检测唯一值?我知道我可以创建一个数组,其中每个索引都由数字 1-9 表示,并且我可以为我找到的该数字的每个可能值将相应索引处的值增加 1,然后再次扫描数组以查找任何值为 1,但这似乎效率极低,每个单元都需要对数组进行两次线性扫描,而数独谜题中有 27 个单元。