Leetcode 37 Sudoku Solver 解數獨,自己的辦法,麻煩有好的辦法,告知
阿新 • • 發佈:2019-02-09
嗯,這道題,覺得很難,但是自己動手寫寫,也就沒有那麼難了。
題目:
編寫一個程式,通過已填充的空格來解決數獨問題。
一個數獨的解法需遵循如下規則:
- 數字
1-9
在每一行只能出現一次。 - 數字
1-9
在每一列只能出現一次。 - 數字
1-9
在每一個以粗實線分隔的3x3
宮內只能出現一次。
空白格用 '.'
表示。
答案被標成紅色。
Note:
- 給定的數獨序列只包含數字
1-9
和字元'.'
。 - 你可以假設給定的數獨只有唯一解。
- 給定數獨永遠是
9x9
形式的。
我的解決辦法:
package test; public class LC37Try1 { public void solveSudoku(char[][] board) { sudo(board); } public boolean sudo(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++){ if(!dp1(board,(char) k,i,j)){ continue; } if(!dp2(board,(char) k,i)){ continue; } if(!dp3(board,(char) k,j)){ continue; } board[i][j]=(char) k; if(sudo(board)){ return true; }else{ //失敗,則賦值成原來的值 board[i][j]='.'; } } if(board[i][j]=='.'){ return false; } } } } return true; } //檢查3*3的小格子裡,是不有重複的。 public boolean dp1(char[][] board,char k,int m,int n){ int r=m/3; int l=n/3; for(int i=r*3;i<(r+1)*3;i++){ for(int j=l*3;j<(l+1)*3;j++){ if(board[i][j]==k){ return false; } } } return true; } //檢查同行的是不是有重複的 public boolean dp2(char[][] board,char k,int i){ for(int j=0;j<9;j++){ if(board[i][j]==k){ return false; } } return true; } //檢查同列的是不是有重複的 public boolean dp3(char[][] board,char k,int j){ for(int i=0;i<9;i++){ if(board[i][j]==k){ return false; } } return true; } public static void main(String[] args) { LC37Try1 t = new LC37Try1(); char[][] board = { {'5','3','.','.','7','.','.','.','.'}, {'6','.','.','1','9','5','.','.','.'}, {'.','9','8','.','.','.','.','.','.'}, {'8','.','.','.','6','.','.','.','3'}, {'4','.','.','8','.','3','.','.','1'}, {'7','.','.','.','2','.','.','.','6'}, {'.','6','.','.','.','.','2','8','.'}, {'.','.','.','4','1','9','.','.','5'}, {'.','.','.','.','8','.','.','7','9'} }; t.solveSudoku(board); for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ System.out.print(board[i][j]+","); } System.out.println(); } } }
哈哈哈