题目链接:valid-sudoku
import java.util.Arrays; /** * Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character '.'. A partially filled sudoku which is valid. Note: A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated. * */ public class ValidSudoku { //数度有解的条件 // Every digit from 1 to 9 must appear: 1-9 这九个数字必须在下面各种情况只出现一次 // In each of the columns, 每列 // in each of the rows, 每行 // and in each of the nine boxes. 每个九宫格 // 501 / 501 test cases passed. // Status: Accepted // Runtime: 369 ms // Submitted: 1 minute ago //检查该数独是否有效 //时间复杂度O(n^2) 空间复杂度O(n) public boolean isValidSudoku(char[][] board) { boolean[] flag = new boolean[10];//标记 // 检查九行 for (int i = 0; i < 9; i++) { Arrays.fill(flag, false); for (int j = 0; j < 9; j++) { if(board[i][j] == '.') continue; if (!flag[board[i][j] - '0']) { flag[board[i][j] - '0'] = true; } else { return false; } } } // 检查九列 for (int j = 0; j < 9; j++) { Arrays.fill(flag, false); for (int i = 0; i < 9; i++) { if(board[i][j] == '.') continue; if (!flag[board[i][j] - '0']) { flag[board[i][j] - '0'] = true; } else { return false; } } } //检查九个九宫格 for (int i = 0; i < 9; i += 3) { for (int j = 0; j < 9; j += 3) { Arrays.fill(flag, false); for (int i1 = 0; i1 < 3; i1++) { for (int j1 = 0; j1 < 3; j1++) { if(board[i + i1][j + j1] == '.') continue; if (!flag[board[i + i1][j + j1] - '0']) { flag[board[i + i1][j + j1] - '0'] = true; } else { return false; } } } } } return true; } public static void main(String[] args) { // TODO Auto-generated method stub } }
题目链接:sudoku-solver
/** * Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by the character '.'. You may assume that there will be only one unique solution. * */ public class SudokuSolver { // 6 / 6 test cases passed. // Status: Accepted // Runtime: 260 ms // Submitted: 0 minutes ago //输入的数独只有唯一解 //回溯法 //时间复杂度O(n^4) 空间复杂度O(1) public void solveSudoku(char[][] board) { solveSudoku1(board); } public boolean solveSudoku1(char[][] board) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if(board[i][j] == '.') { for (int k = 1; k <= 9; k++) { board[i][j] = (char) ('0' + k); if(isValid(board, i, j) && solveSudoku1(board)) { return true; } else { board[i][j] = '.'; //回溯法 } } return false; } } } return true; } public boolean isValid(char[][] board, int i, int j) { //检查所属行 for (int k = 0; k < 9; k++) { if(i != k && board[i][j] == board[k][j]) return false; } //检查所属列 for (int k = 0; k < 9; k++) { if(j != k && board[i][j] == board[i][k]) return false; } //检查所属九宫格 for (int i1 = 3 * (i / 3); i1 < (i / 3 + 1) * 3; i1 ++) { for (int j1 = 3 * (j / 3); j1 < (j / 3 + 1) * 3; j1 ++) { if(i1 != i && j1 != j && board[i][j] == board[i1][j1]) return false; } } return true; } public static void main(String[] args) { // TODO Auto-generated method stub } }
[LeetCode 36&37] Valid Sudoku & Sudoku Solver (数独问题)
原文地址:http://blog.csdn.net/ever223/article/details/44775963