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