LeetCode 的算法题 PHP解法记录
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字
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>
说明:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 给定数独序列只包含数字
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 '盒子中有重复数字';
}
}
}
}