PHP數(shù)獨矩陣生成器
作者: 鄭曉 分類: PHP 發(fā)布于: 2016-09-13 22:48 瀏覽:14,570 評論(2)
維基百科:
數(shù)獨是一種邏輯性的數(shù)字填充游戲,玩家須以數(shù)字填進每一格,而每行、每列和每個宮(即3×3的大格)有齊1至9所有數(shù)字。游戲設計者會提供一部分的數(shù)字,使謎題只有一個答案。
一個經典的數(shù)獨迷題是這樣的:
解答是這樣的:
數(shù)獨的每一行和每一列及每一個小九宮格中的數(shù)字都是1-9個數(shù)字,且不能有重復。
所以要生成一個數(shù)獨矩陣的方法可以是先定義一個已完成的數(shù)獨矩陣做為模板,將其每一組的一行或一列進行隨機互換(如把上面解答中的第1、2行互換、第4、6列進行互換)。這樣便在保持一行或一列上數(shù)字不重復的同時也保證了每個小九宮格的數(shù)字不會重復。這算是一種投機取巧吧。。。
下面是鄭曉用PHP寫的一個數(shù)獨生成器,只是實現(xiàn)了隨機組合數(shù)獨矩陣,并沒有進行摳除。
$tpl = '618923754974651832523847961732516498491738625865492317146289573389175246257364189';
$arr = array();
//把模板數(shù)據初始化為數(shù)獨二維數(shù)組矩陣
//這里第一維是行,第二維是列
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 '
',$arr[$row][$col],' |
';
運行效果:
本文采用知識共享署名-非商業(yè)性使用 3.0 中國大陸許可協(xié)議進行許可,轉載時請注明出處及相應鏈接。
本文永久鏈接: http://yjfs.org.cn/php-sudoku-generator.html
怎么使用這個
復制粘貼執(zhí)行。