Java 在数独中寻找零

Java 在数独中寻找零,java,arrays,sudoku,Java,Arrays,Sudoku,我有一个课堂作业(已经过去了),我必须写一个数独解算器。我能够创建一个方法来解决每个缺失的数字。但是我很难找到一种方法来找到我需要解决的细胞。我应该取一个2D数组,并填入缺失的数字(用0表示)。 我在下面写了一些代码,但不是全部(即使任务通过了,我尊重profs的意愿) 公共级数独{ 私有静态int[]grid=newint[9][9]; 公共静态int[]]getSolution(int[]]grid){ 对于(int i=0;i

我有一个课堂作业(已经过去了),我必须写一个数独解算器。我能够创建一个方法来解决每个缺失的数字。但是我很难找到一种方法来找到我需要解决的细胞。我应该取一个2D数组,并填入缺失的数字(用0表示)。 我在下面写了一些代码,但不是全部(即使任务通过了,我尊重profs的意愿)

公共级数独{
私有静态int[]grid=newint[9][9];
公共静态int[]]getSolution(int[]]grid){
对于(int i=0;i<9;i++){
数组复制(网格[i],0,数独网格[i],0,9);
}
int n=getZero();
返回getSolution(n);
}
私有静态int[]getSolution(int n){
如果(n==0){
返回网格;
}
Cell=getZero();
int行=cell.row;
int column=cell.column;

对于(int number=1;number,我可以告诉您希望在
网格中查找第一个0值单元格。我将第一个定义为包含零的最低行中的第一个包含零的列

这可以通过简单的搜索完成:

private Cell getZeroCell(){
    int rz = -1;
    int cz = -1;
    outer: for(int row = 0; row < grid.length; row++){
        for(int col = 0; col < grid[row].length; col++){
            if(grid[row][col] == 0){
               rz = row;
               cz = col;
               break outer;
            }
        }
    }
    if(rz == -1 || cz == -1){
       // no zeros found
       return null;
    }else{
       // first zero found at row `rz` and column `cz`
       Cell cell = new Cell();
       cell.row = rz;
       cell.column = cz;
       return cell;
    }
}
private Cell getZeroCell(){
int rz=-1;
int-cz=-1;
外部:用于(int row=0;row
获取包含零的第一个单元格的“编号”(从左到右计数,然后从上到下计数,0索引):

private int getZeroInt(){
int rz=-1;
int-cz=-1;
外部:用于(int row=0;row
获取包含零的单元格数:

private int getNumZeros(){
    int count = 0;
    for(int row = 0; row < grid.length; row++){
        for(int col = 0; col < grid[row].length; col++){
            if(grid[row][col] == 0){
              count++;
            }
        }
    }
    return count;
}
private int getNumZeros(){
整数计数=0;
对于(int row=0;row
根据我所知,您希望在
网格中找到第一个0值单元格。我将第一个定义为包含零的最低行中的第一个包含零的列

这可以通过简单的搜索完成:

private Cell getZeroCell(){
    int rz = -1;
    int cz = -1;
    outer: for(int row = 0; row < grid.length; row++){
        for(int col = 0; col < grid[row].length; col++){
            if(grid[row][col] == 0){
               rz = row;
               cz = col;
               break outer;
            }
        }
    }
    if(rz == -1 || cz == -1){
       // no zeros found
       return null;
    }else{
       // first zero found at row `rz` and column `cz`
       Cell cell = new Cell();
       cell.row = rz;
       cell.column = cz;
       return cell;
    }
}
private Cell getZeroCell(){
int rz=-1;
int-cz=-1;
外部:用于(int row=0;row
获取包含零的第一个单元格的“编号”(从左到右计数,然后从上到下计数,0索引):

private int getZeroInt(){
int rz=-1;
int-cz=-1;
外部:用于(int row=0;row
获取包含零的单元格数:

private int getNumZeros(){
    int count = 0;
    for(int row = 0; row < grid.length; row++){
        for(int col = 0; col < grid[row].length; col++){
            if(grid[row][col] == 0){
              count++;
            }
        }
    }
    return count;
}
private int getNumZeros(){
整数计数=0;
对于(int row=0;row
您不会检查数字是否在同一个3x3正方形中重复(仅行和列)

我不明白你说的“找零”是什么意思。事实上,从第一行或最后一行解数独都没有意义。我会解释我为同样的麻烦做了什么

  • 单元格不是int,而是一个对象。在对象中,我存储一个值(如果找到,则为数字,如果没有,则为0)和一个布尔值[9]。False表示(索引+1)被丢弃,因为它位于同一行/列/正方形中,true表示尚未确定。此外,还有3个列表(向量、集合等)
  • 81个单元格的列表(如果愿意,可以将其设置为二维数组)
  • 9个列表/向量/集合表示行,9个表示列,9个表示正方形。81个单元格中的每个单元格都分配给其行/列/正方形。在每个单元格中,您存储对其所属列表的引用
  • 现在是执行部分。在第一次迭代中,每次您找到一个非零(数独中固定的数字),您都会在单元格所属的列表中循环。对于这些列表中的每个单元格,您会将分配给该数字的布尔值标记为false
  • 循环遍历单元格,每次找到0时,检查单元格中有多少布尔值为真。如果为1(所有其他8个可能的值都已被丢弃),则为单元格的值。设置它,如4所示得到它所属的列表,并在每个单元格中将该数字标记为false。循环,直到得到解决方案或无法设置任何值的迭代