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

PHP数独矩阵生成器

作者: 郑晓 分类: PHP 发布于: 2016-09-13 22:48 浏览:14,053 评论(2)


维基百科:

数独是一种逻辑性的数字填充游戏,玩家须以数字填进每一格,而每行、每列和每个宫(即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 '

';
for($row=0;$row<9;$row++) { echo '
';
for($col=0;$col<9;$col++) { echo '

';
}
echo '

';
}
echo '

',$arr[$row][$col],'

';

运行效果:
sudoku-result

       

本文采用知识共享署名-非商业性使用 3.0 中国大陆许可协议进行许可,转载时请注明出处及相应链接。

本文永久链接: https://www.zh30.com/php-sudoku-generator.html

PHP数独矩阵生成器:目前有2 条留言

用户评论头像 子威发表于 2018年06月06日 19:33[回复]

怎么使用这个

    用户评论头像 郑晓发表于 2018年06月07日 09:25[回复]

    复制粘贴执行。

发表评论

change vcode