36.有效的数独

2018-05-16  本文已影响0人  织毛衣的手

LeetCode 的算法题 PHP解法记录

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 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>

说明:

解:先写解 得一分

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 '盒子中有重复数字';
            }
        }
    }   
}
上一篇 下一篇

猜你喜欢

热点阅读