當前位置: 博客首頁 >> PHP >> 閱讀正文

PHP數(shù)獨矩陣生成器

作者: 鄭曉 分類: PHP 發(fā)布于: 2016-09-13 22:48 瀏覽:14,570 評論(2)


維基百科:

數(shù)獨是一種邏輯性的數(shù)字填充游戲,玩家須以數(shù)字填進每一格,而每行、每列和每個宮(即3×3的大格)有齊1至9所有數(shù)字。游戲設計者會提供一部分的數(shù)字,使謎題只有一個答案。

一個經典的數(shù)獨迷題是這樣的:
sudoku
解答是這樣的:
sudoku-solution
數(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 '

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

';
}
echo '

';
}
echo '

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

';

運行效果:
sudoku-result

? ? ? ?

本文采用知識共享署名-非商業(yè)性使用 3.0 中國大陸許可協(xié)議進行許可,轉載時請注明出處及相應鏈接。

本文永久鏈接: http://yjfs.org.cn/php-sudoku-generator.html

PHP數(shù)獨矩陣生成器:目前有2 條留言

用戶評論頭像 子威發(fā)表于 2018年06月06日 19:33[回復]

怎么使用這個

    用戶評論頭像 鄭曉發(fā)表于 2018年06月07日 09:25[回復]

    復制粘貼執(zhí)行。

發(fā)表評論

change vcode