题意:
解题思路:
思路:1. 先遍历行,再遍历列,最后遍历3*3方块;2. 当board[i][j] == '.'时,填充1-9的数,判断该数所在的行、列、单元格是否已有该数, 如果已存在则尝试下一个数,否则将当前数放置该位置,然后继续放下一个数, 放置下一个数成功返回true
PHP代码实现:
class Solution { function solveSudoku(&$board) { if (!$board) return; $this->solve($board); } function solve(&$board) { for ($i = 0; $i < count($board); $i++) { for ($j = 0; $j < count($board[0]); $j++) { if ($board[$i][$j] == '.') { for ($c = '1'; $c <= '9'; $c++) { if ($this->valid($board, $i, $j, $c)) { $board[$i][$j] = (string) $c; if ($this->solve($board)) { return true; } $board[$i][$j] = '.'; } } return false; } } } return true; } function valid($board, $row, $col, $c) { for ($i = 0; $i < 9; $i++) { if ($board[$i][$col] != "." && $board[$i][$col] == $c) return false; if ($board[$row][$i] != "." && $board[$row][$i] == $c) return false; $x = 3 * floor($row / 3) + floor($i / 3); $y = 3 * floor($col / 3) + floor($i % 3); if ($board[$x][$y] != '.' && $board[$x][$y] == $c) return false; } return true; }}
GO代码实现:
func solveSudoku(board [][]byte) { solve(board)}func solve(board [][]byte) bool { var c byte for i := 0; i < 9; i++ { // 行 for j := 0; j < 9; j++ { // 列 if board[i][j] == '.' { // 要填充的1-9的数字 for c = '1'; c <= '9'; c++ { // 如果可以放置c if valid(board, i, j, c) { board[i][j] = c // 放置下一个数 if solve(board) { return true } else { board[i][j] = '.' } } } return false } } } return true}// 检查当前行、列、单元格能否放置cfunc valid(board [][]byte, row, col int, c byte) bool { for i := 0; i < 9; i++ { if board[i][col] == c { return false } if board[row][i] == c { return false } if board[3 * (row/3) + i/3][3 * (col/3) + i%3] == c { return false } } return true}