数独规则:

    • 数字 1-9 在每一行只能出现一次。
    • 数字 1-9 在每一列只能出现一次。

    • 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

    1. <?php
    2. // 输入:
    3. // [
    4. // ["5","3",".",".","7",".",".",".","."],
    5. // ["6",".",".","1","9","5",".",".","."],
    6. // [".","9","8",".",".",".",".","6","."],
    7. // ["8",".",".",".","6",".",".",".","3"],
    8. // ["4",".",".","8",".","3",".",".","1"],
    9. // ["7",".",".",".","2",".",".",".","6"],
    10. // [".","6",".",".",".",".","2","8","."],
    11. // [".",".",".","4","1","9",".",".","5"],
    12. // [".",".",".",".","8",".",".","7","9"]
    13. // ]
    14. // 输出: true
    15. class Solution {
    16. public function isValidSudoku(array $sudo) {
    17. $n = count($sudo);
    18. $littleSquare = [];
    19. $col = [];
    20. for ($i = 0; $i < $n; $i++) {
    21. $row = [];
    22. for ($j = 0; $j < $n; $j++) {
    23. // '.' 跳过
    24. if ($sudo[$i][$j] == '.') continue;
    25. // 检查行
    26. if (isset($row[$sudo[$i][$j]])) {
    27. return false;
    28. } else {
    29. $row[$sudo[$i][$j]] = 1;
    30. }
    31. // 检查列
    32. if (isset($col[$j][$sudo[$i][$j]])) {
    33. return false;
    34. } else {
    35. $col[$j][$sudo[$i][$j]] = 1;
    36. }
    37. // 检查小正方形
    38. if (isset($littleSquare[floor($i / 3)][floor(($j / 3))][$sudo[$i][$j]])) {
    39. return false;
    40. } else {
    41. $littleSquare[floor($i / 3)][floor(($j / 3))][$sudo[$i][$j]] = 1;
    42. }
    43. }
    44. }
    45. return true;
    46. }
    47. }
    48. $sudo = [
    49. ["5","3",".",".","7",".",".",".","."],
    50. ["6",".",".","1","9","5",".",".","."],
    51. [".","9","8",".",".",".",".","6","."],
    52. ["8",".",".",".","6",".",".",".","3"],
    53. ["4",".",".","8",".","3",".",".","1"],
    54. ["7",".",".",".","2",".",".",".","6"],
    55. [".","6",".",".",".",".","2","8","."],
    56. [".",".",".","4","1","9",".",".","5"],
    57. [".",".",".",".","8",".",".","7","9"]
    58. ];
    59. $cls = new Solution();
    60. $r = $cls->isValidSudoku($sudo);
    61. var_dump($r);exit;