编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 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;}}
}