我正在用PHP写一个算法来解决给定的数独谜题。我已经设置了一个稍微面向对象的实现至少两个类:一个Square
类用于在9x9的板上的每个个体瓦片和Sudoku
类,其具有Square
秒的矩阵来表示板。在只出现一次的字符串中查找字符
我使用的算法的实现是一种三层次的办法。第一步只能解决最基本的谜题(但效率最高),其方法是根据棋盘的初始设置填写任何只能取一个值的方块,然后相应地调整其余部分的约束条件未解决的广场。
通常,“常量传送”的这个过程中没有解决板完全,但它确实解决了相当大的块。第二层然后踢入。这解析每个单元(或者9个正方形,它们必须全都具有唯一的数字分配,例如行或列)以用于每个未解码正方形的“可能”值。可能的值的该列表表示为Square
类的字符串:
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
鉴于未解平方在一个单元中的整个阵列(如上面在第二层中所述),第二层将串联的所有字符串“可能性”转换为单个字符串。然后,它将通过该单个字符串搜索任何独特的字符值 - 不会重复的值。这将表明,在正方形单位内,只有一个正方形可以采用该特定值。
我的问题是:执行本二线,我怎么能在解析一个单位的所有可能值的这个字符串,方便地检测的独特价值(S)?我知道我可以创建一个数组,其中每个索引由数字1-9表示,并且我可以将相应索引处的值递增1,以找到该数字的每个可能值,然后再次扫描数组值为1,但这看起来非常低效,需要对每个单元进行两次线阵扫描,而在一个数独拼图中,有27个单位。