题意:

image.png

解题思路:

  1. 思路:
  2. 1. 先遍历行,再遍历列,最后遍历3*3方块;
  3. 2. board[i][j] == '.'时,填充1-9的数,判断该数所在的行、列、单元格是否已有该数,
  4. 如果已存在则尝试下一个数,否则将当前数放置该位置,然后继续放下一个数,
  5. 放置下一个数成功返回true

PHP代码实现:

  1. class Solution {
  2. function solveSudoku(&$board) {
  3. if (!$board) return;
  4. $this->solve($board);
  5. }
  6. function solve(&$board) {
  7. for ($i = 0; $i < count($board); $i++) {
  8. for ($j = 0; $j < count($board[0]); $j++) {
  9. if ($board[$i][$j] == '.') {
  10. for ($c = '1'; $c <= '9'; $c++) {
  11. if ($this->valid($board, $i, $j, $c)) {
  12. $board[$i][$j] = (string) $c;
  13. if ($this->solve($board)) {
  14. return true;
  15. }
  16. $board[$i][$j] = '.';
  17. }
  18. }
  19. return false;
  20. }
  21. }
  22. }
  23. return true;
  24. }
  25. function valid($board, $row, $col, $c) {
  26. for ($i = 0; $i < 9; $i++) {
  27. if ($board[$i][$col] != "." && $board[$i][$col] == $c) return false;
  28. if ($board[$row][$i] != "." && $board[$row][$i] == $c) return false;
  29. $x = 3 * floor($row / 3) + floor($i / 3);
  30. $y = 3 * floor($col / 3) + floor($i % 3);
  31. if ($board[$x][$y] != '.' && $board[$x][$y] == $c) return false;
  32. }
  33. return true;
  34. }
  35. }

GO代码实现:

  1. func solveSudoku(board [][]byte) {
  2. solve(board)
  3. }
  4. func solve(board [][]byte) bool {
  5. var c byte
  6. for i := 0; i < 9; i++ { // 行
  7. for j := 0; j < 9; j++ { // 列
  8. if board[i][j] == '.' {
  9. // 要填充的1-9的数字
  10. for c = '1'; c <= '9'; c++ {
  11. // 如果可以放置c
  12. if valid(board, i, j, c) {
  13. board[i][j] = c
  14. // 放置下一个数
  15. if solve(board) {
  16. return true
  17. } else {
  18. board[i][j] = '.'
  19. }
  20. }
  21. }
  22. return false
  23. }
  24. }
  25. }
  26. return true
  27. }
  28. // 检查当前行、列、单元格能否放置c
  29. func valid(board [][]byte, row, col int, c byte) bool {
  30. for i := 0; i < 9; i++ {
  31. if board[i][col] == c {
  32. return false
  33. }
  34. if board[row][i] == c {
  35. return false
  36. }
  37. if board[3 * (row/3) + i/3][3 * (col/3) + i%3] == c {
  38. return false
  39. }
  40. }
  41. return true
  42. }