大家好,很久没更新了,今天写一写解数独的算法吧,这是一道leetcode困难级别的题目,本人的算法跟真正的大神相比效率一般,花费的时间和空间都很多。不过对于大多数人来说应该是最直观,最易懂的。
这道题目考虑的是最基本的数独,也就是每行,每列,每宫都是1到9。没有其他更加复杂的规则
题目当中数独是以一种二维字符矩阵(char[][])来呈现的。那么首先我们可以创立一个全局变量nums
char[] nums={
'1','2','3','4','5','6','7','8','9'};
这样的话在之后的执行中可以直接引用字符,不需要考虑字符与整数之间的转换。
相信很多玩过数独的人都知道数独有两种基本的排除法。
1.当一个格子不可能是其他八个数的时候,那它一定就是剩下的那一个数。
2.当一个格子所在的行\列\宫当中其它空格都不可能是某一个数的时候,那么这个格子必然是这个数。(只要符合规则)
首先我们要先写出三条规则的判定方法。
//判断所在的行没有重复的数字
public boolean checkRow(char[][] board,int row,char val){
for(int i=0;i<9;i++){
if(board[row][i]==val){
return false;
}
}
return true;
}
//判断所在的列没有重复的数字
public boolean checkCol(char[][] board,int col,char val){
for(int i=0;i<9;i++){
if(board[i][col]==val){
return false;
}
}
return true;
}
//判断所在的宫没有重复的数字,这里判断格子所在的宫稍微有点难度
public boolean checkGrid(char[][] board,int row,int col,char val){
int start1=(row/3)*3; //找出左上角格子所在的行
int start2=(col/3)*3; //找出左上角格子所在的列
for(int i=start1;i<start1+3;i++){
//锁定左上角格子,开始循环
for(int j=start2;j<start2+3;j++){