DFS。这种思路清晰的题目,大问题一般出在小地方。
1.当DFS找到时,要返回true。这样一路true上去,否则最后格子又会被设为'.';
2.计算格子所在九宫格时,要用int a = x/3*3+i; 忘记乘3了,一直错;
public class Solution { public void solveSudoku(char[][] board) { // Start typing your Java solution below // DO NOT write main() function int m = board.length; if (m == 0) return; int n = board[0].length; if (n == 0) return; ArrayList<Point> arr = new ArrayList<Point>(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (board[i][j] == '.') { Point p = new Point(); p.x = i; p.y = j; arr.add(p); } } } dfs(board, arr, 0); } boolean dfs(char[][] board, ArrayList<Point> arr, int k) { if (k == arr.size()) { return true; } else { for (int d = 0; d < 9; d++) { Point p = arr.get(k); board[p.x][p.y] = (char)(d + '1'); // check valid if (IsValid(board, p.x, p.y) && dfs(board, arr, k+1)) { return true; } board[p.x][p.y] = '.'; } } return false; } private boolean IsValid(char[][] board, int x, int y) { int len = board.length; char c = board[x][y]; for (int i = 0; i < len; i++) { if (x != i && board[i][y] == c) { return false; } } for (int i = 0; i < len; i++) { if (y != i && board[x][i] == c) { return false; } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int a = x/3*3+i; int b = y/3*3+j; if ((a != x) && (b != y) && board[a][b] == c) { return false; } } } return true; } } class Point { public int x; public int y; }