編寫一個程序,通過已填充的空格來解決數獨問題。
一個數獨的解法需遵循如下規則:
數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
空白格用 ‘.’ 表示。
Note:
給定的數獨序列只包含數字 1-9 和字符 ‘.’ 。
你可以假設給定的數獨只有唯一解。
給定數獨永遠是 9x9 形式的。
代碼
class Solution {Map<Integer,HashSet<Integer>> col=new HashMap<>();//記錄行Map<Integer,HashSet<Integer>> row=new HashMap<>();//記錄列Map<Integer,Map<Integer,HashSet<Integer>> >map3=new HashMap<>();//記錄3x3public void solveSudoku(char[][] board) {int n=board.length,m=board[0].length;for(int i=0;i<n;i++)row.put(i,new HashSet<>());for(int j=0;j<m;j++)col.put(j,new HashSet<>());for(int i=0;i<3;i++){map3.put(i,new HashMap<>());for(int j=0;j<3;j++)map3.get(i).put(j,new HashSet<>());}for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(Character.isDigit(board[i][j]))//將已經填好的數據存進hashmap{col.get(j).add(board[i][j]-'0');row.get(i).add(board[i][j]-'0');map3.get(i/3).get(j/3).add(board[i][j]-'0');}getSolveSudoku(board,0);}public boolean getSolveSudoku(char[][] board,int loc) {if(loc==81) return true;int i=loc/9,j=loc%9;if(Character.isDigit(board[i][j])) {return getSolveSudoku(board, loc+1);}else {for(int k=1;k<10;k++)//遍歷所有可能的情況{if(col.get(j).contains(k)||row.get(i).contains(k)|| map3.get(i/3).get(j/3).contains(k)) continue;//當前數字不滿足col.get(j).add(k);row.get(i).add(k);map3.get(i/3).get(j/3).add(k);board[i][j]=(char) (k+'0');if(getSolveSudoku(board, loc+1)) return true;board[i][j]='.';col.get(j).remove(k);//回溯map3.get(i/3).get(j/3).remove(k);row.get(i).remove(k);}return false;}}
}