37. 解数独
Posted yfs123456
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了37. 解数独相关的知识,希望对你有一定的参考价值。
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.‘ 表示。
一个数独。
答案被标成红色。
Note:
给定的数独序列只包含数字 1-9 和字符 ‘.‘ 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sudoku-solver
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1 public class Solution 2 private boolean[][] row = null; 3 private boolean[][] col = null; 4 private boolean[][][] palace = null; 5 6 // cur表示行 7 private boolean helper(char[][] board, int i, int j) 8 // i行j列 9 for (int k = 1; k < 10; k++) 10 if (!row[i][k] && !col[j][k] && !palace[i/3][j/3][k]) 11 board[i][j] = (char)(k+‘0‘); 12 row[i][k] = true; 13 col[j][k] = true; 14 palace[i/3][j/3][k] = true; 15 int ii=i,jj=j; 16 while (board[ii][jj] != ‘.‘) 17 if (jj < 8) 18 jj = jj + 1; 19 else if (jj == 8) 20 ii = ii + 1; 21 jj = 0; 22 23 if (ii == 9) 24 return true; 25 26 27 if(helper(board,ii,jj)) 28 return true; 29 board[i][j] = ‘.‘; 30 row[i][k] = false; 31 col[j][k] = false; 32 palace[i/3][j/3][k] = false; 33 34 35 return false; 36 37 38 public void solveSudoku(char[][] board) 39 row = new boolean[9][9+1]; 40 col = new boolean[9][9+1]; 41 palace = new boolean[3][3][9+1]; 42 int ii = -1,jj = -1; 43 for (int i = 0; i < 9; i++) 44 for (int j = 0; j < 9; j++) 45 char elem = board[i][j]; 46 if (elem == ‘.‘) 47 if (ii == -1 && jj == -1) 48 ii = i; 49 jj = j; 50 51 continue; 52 53 row[i][elem-‘0‘] = true; 54 col[j][elem-‘0‘] = true; 55 palace[i/3][j/3][elem-‘0‘] = true; 56 57 58 helper(board,ii,jj); 59 60 61 private void print(char[][] board) 62 for (int i = 0; i < 9; i++) 63 for (int j = 0; j < 9; j++) 64 System.out.print(board[i][j]+" "); 65 66 System.out.println(); 67 68 69 70 public static void main(String[] args) 71 char[][] board = 72 ‘5‘,‘3‘,‘.‘,‘.‘,‘7‘,‘.‘,‘.‘,‘.‘,‘.‘, 73 ‘6‘,‘.‘,‘.‘,‘1‘,‘9‘,‘5‘,‘.‘,‘.‘,‘.‘, 74 ‘.‘,‘9‘,‘8‘,‘.‘,‘.‘,‘.‘,‘.‘,‘6‘,‘.‘, 75 ‘8‘,‘.‘,‘.‘,‘.‘,‘6‘,‘.‘,‘.‘,‘.‘,‘3‘, 76 ‘4‘,‘.‘,‘.‘,‘8‘,‘.‘,‘3‘,‘.‘,‘.‘,‘1‘, 77 ‘7‘,‘.‘,‘.‘,‘.‘,‘2‘,‘.‘,‘.‘,‘.‘,‘6‘, 78 ‘.‘,‘6‘,‘.‘,‘.‘,‘.‘,‘.‘,‘2‘,‘8‘,‘.‘, 79 ‘.‘,‘.‘,‘.‘,‘4‘,‘1‘,‘9‘,‘.‘,‘.‘,‘5‘, 80 ‘.‘,‘.‘,‘.‘,‘.‘,‘8‘,‘.‘,‘.‘,‘7‘,‘9‘ 81 ; 82 new Solution().solveSudoku(board); 83 84
以上是关于37. 解数独的主要内容,如果未能解决你的问题,请参考以下文章