LeetCode 的算法題 PHP解法記錄
判斷一個 9x9 的數獨是否有效州袒。只需要根據以下規(guī)則揭绑,驗證已經填入的數字是否有效即可。
- 數字
1-9
在每一行只能出現一次郎哭。 - 數字
1-9
在每一列只能出現一次洗做。 - 數字
1-9
在每一個以粗實線分隔的3x3
宮內只能出現一次。
<small>上圖是一個部分填充的有效的數獨彰居。</small>
數獨部分空格內已填入了數字诚纸,空白格用 '.'
表示。
示例 1:
<pre>輸入:
array(
["5", "3", ".", ".", "7", ".", ".", ".", "."],
["6", ".", ".", "1", "9", "5", ".", ".", "."],
[".", "9", "8", ".", ".", ".", ".", "6", "."],
["8", ".", ".", ".", "6", ".", ".", ".", "3"],
["4", ".", ".", "8", ".", "3", ".", ".", "1"],
["7", ".", ".", ".", "2", ".", ".", ".", "6"],
[".", "6", ".", ".", ".", ".", "2", "8", "."],
[".", ".", ".", "4", "1", "9", ".", ".", "5"],
[".", ".", ".", ".", "8", ".", ".", "7", "9"]
);
輸出: true
</pre>
示例 2:
<pre>輸入:
array(
["8", "3", ".", ".", "7", ".", ".", ".", "."],
["6", ".", ".", "1", "9", "5", ".", ".", "."],
[".", "9", "8", ".", ".", ".", ".", "6", "."],
["8", ".", ".", ".", "6", ".", ".", ".", "3"],
["4", ".", ".", "8", ".", "3", ".", ".", "1"],
["7", ".", ".", ".", "2", ".", ".", ".", "6"],
[".", "6", ".", ".", ".", ".", "2", "8", "."],
[".", ".", ".", "4", "1", "9", ".", ".", "5"],
[".", ".", ".", ".", "8", ".", ".", "7", "9"]
);
輸出: false
解釋: 除了第一行的第一個數字從 5 改為 8 以外陈惰,空格內其他數字均與 示例1 相同畦徘。
但由于位于左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。</pre>
說明:
- 一個有效的數獨(部分已被填充)不一定是可解的抬闯。
- 只需要根據以上規(guī)則井辆,驗證已經填入的數字是否有效即可。
- 給定數獨序列只包含數字
1-9
和字符'.'
溶握。 - 給定數獨永遠是
9x9
形式的杯缺。
解:先寫解 得一分
function du($arr){
// 橫豎 驗證
for($i=0;$i<9;$i++){
$heng=array();
$shu=array();
for($j=0;$j<9;$j++){
if($arr[$i][$j] != '.'){
$heng[] = $arr[$i][$j];
}
if($arr[$j][$i] != '.'){
$shu[] = $arr[$j][$i];// 也許我應該用col 和 row 但是我相信 世界是英文的也是中文的,最終一定是拼音的 =睡榆。=
}
}
if(count($heng) != count(array_unique($heng))){
echo '橫排'.$j.'有重復數字';
}
if(count($shu) != count(array_unique($shu))){
echo '豎排'.$i.'有重復數字';
}
}
// 九格驗證
for($m=0;$m<9;$m+=3){
for($n=0;$n<9;$n+=3){
$box = array();
for ($i = $m; $i < $m+3; $i++) {
for ($j = $n; $j < ($n+3); $j++) {
if ($arr[$i][$j] != '.') {
$box[] = $arr[$i][$j];
}
}
}
if (count($box) != count(array_unique($box))) {
echo '盒子中有重復數字';
}
}
}
}