package com.interview.leetcode.matrix; import java.util.Arrays; /** * Created_By: stefanie * Date: 14-11-16 * Time: 下午7:14 * * https://oj.leetcode.com/problems/sudoku-solver/ */ public class SudokuGame { public static boolean solve(char[][] board) { for(int i = 0; i < 9; i++) { for(int j = 0; j < 9; j++){ if(board[i][j] != '.') continue; for(int k = 1; k <= 9; k++){ board[i][j] = (char) (k + '0'); if (isValid(board, i, j) && solve(board)) return true; board[i][j] = '.'; } return false; } } return true; } private static boolean isValid(char[][] board, int row, int col){ //just valid row and col and given sub cube boolean[] visited = new boolean[10]; for(int j = 0;j < 9; j++){ if(!check(board[row][j], visited)) return false; } visited = new boolean[10]; for(int j = 0; j < 9; j++){ if(!check(board[j][col], visited)) return false; } visited = new boolean[10]; row = row / 3; col = col / 3; for (int m = 0; m < 3; m++) { for (int n = 0; n < 3; n++){ if(!check(board[row * 3 + m][col * 3 + n], visited)) return false; } } return true; } private static boolean check(char digit, boolean[] visited){ if(digit == '.') return true; int ch = digit - '0'; if(visited[ch]) return false; visited[ch] = true; return true; } public static boolean isValid(char[][] board) { boolean[] visited = new boolean[9]; // row for(int i = 0; i<9; i++){ Arrays.fill(visited, false); for(int j = 0; j<9; j++){ if(!check(visited, board[i][j])) return false; } } //col for(int i = 0; i<9; i++){ Arrays.fill(visited, false); for(int j = 0; j<9; j++){ if(!check(visited, board[j][i])) return false; } } // sub matrix for(int i = 0; i<9; i+= 3){ for(int j = 0; j<9; j+= 3){ Arrays.fill(visited, false); for(int k = 0; k<9; k++){ if(!check(visited, board[i + k / 3][j + k % 3])) return false; } } } return true; } private static boolean check(boolean[] visited, char digit){ if(digit == '.') return true; int num = digit - '0'; if ( num < 1 || num > 9 || visited[num-1]) return false; visited[num-1] = true; return true; } }