当前位置:博客首页>>PHP>>阅读正文

PHP数独矩阵生成器

作者 郑晓 发布时间 2016-09-13 22:48 文章分类 PHP 文章评论 抢沙发 阅读次数已被围观898次

维基百科:

数独是一种逻辑性的数字填充游戏,玩家须以数字填进每一格,而每行、每列和每个宫(即3×3的大格)有齐1至9所有数字。游戏设计者会提供一部分的数字,使谜题只有一个答案。

一个经典的数独迷题是这样的:
sudoku
解答是这样的:
sudoku-solution
数独的每一行和每一列及每一个小九宫格中的数字都是1-9个数字,且不能有重复。

所以要生成一个数独矩阵的方法可以是先定义一个已完成的数独矩阵做为模板,将其每一组的一行或一列进行随机互换(如把上面解答中的第1、2行互换、第4、6列进行互换)。这样便在保持一行或一列上数字不重复的同时也保证了每个小九宫格的数字不会重复。这算是一种投机取巧吧。。。
下面是郑晓用PHP写的一个数独生成器,只是实现了随机组合数独矩阵,并没有进行抠除。

$tpl = '618923754974651832523847961732516498491738625865492317146289573389175246257364189';
$arr = array();
//把模板数据初始化为数独二维数组矩阵
//这里第一维是行,第二维是列
for($row=0;$row<9;$row++) {
    for($col=0;$col<9;$col++) {
        $arr[$row][$col] = $tpl[$row*9+$col];
    }
}
//第一组 行交换
$r1 = rand(0,2);
$r2 = rand(0,2);
list($arr[$r1], $arr[$r2]) = array($arr[$r2], $arr[$r1]);
//第二组 行交换
$r1 = rand(3,5);
$r2 = rand(3,5);
list($arr[$r1], $arr[$r2]) = array($arr[$r2], $arr[$r1]);
//第三组 行交换
$r1 = rand(6,8);
$r2 = rand(6,8);
list($arr[$r1], $arr[$r2]) = array($arr[$r2], $arr[$r1]);

//第一组 列交换
$r1 = rand(0,2);
$r2 = rand(0,2);
for($i=0;$i<9;$i++) {
    list($arr[$i][$r2], $arr[$i][$r1]) = array($arr[$i][$r1], $arr[$i][$r2]);
}
//第二组 列交换
$r1 = rand(3,5);
$r2 = rand(3,5);
for($i=0;$i<9;$i++) {
    list($arr[$i][$r2], $arr[$i][$r1]) = array($arr[$i][$r1], $arr[$i][$r2]);
}
//第三组 列交换
$r1 = rand(6,8);
$r2 = rand(6,8);
for($i=0;$i<9;$i++) {
    list($arr[$i][$r2], $arr[$i][$r1]) = array($arr[$i][$r1], $arr[$i][$r2]);
}

//九宫格式输出
echo '<br><table style="border-collapse:collapse">';
for($row=0;$row<9;$row++) {
    echo '<tr style="border: 1px solid black;">';
    for($col=0;$col<9;$col++) {
        echo '<td style="border: 1px solid black; width:30px; height:30px; text-align:center" >',$arr[$row][$col],'</td>';
    }
    echo '</tr>';
}
echo '</table>';

运行效果:
sudoku-result


如果此文章对您有所帮助,希望能支持我一下~
  • ¥1.00 (支付宝/郑晓)
  • ¥1.00 (微信/zx)
  • 土豪无上限 (支付宝/郑晓)
  • 土豪无上限 (微信/zx)

发表评论

change vcode看不清?点击换一张!