如果不确定数字,如何验证数组和添加数字?

时间:2017-09-03 06:59:35

标签: java arrays

我认为标题可能会让它听起来更容易。

基本上我必须检查2d suduko数组是否有效。

public class Sudoku{

//The n x m grid that defines the Sudoku
private int[][] theGrid;
//the number that defines the empty cell
private int empty;

//constructor
public Sudoku(int[][] g){
    theGrid = g;
}

//secondary constructor, where e represents the empty cell
public Sudoku(int[][] g, int e){
    theGrid = g;
    empty = e;
}

public boolean isValid(){
//checks each row, column and sub box inside
}

在将上述内容放入数组之后,为每个行,列和子框调用以下函数,以确保sudkou的每个方面都有效。

public boolean checkValues(int[] a){
    int[] vals = new int[a.length + 1];
    for (int i = 0; i < a.length; i++){
        //number out of range and not empty cell
        if ((a[i] < 1 || a[i] > a.length) && a[i]!=empty)
            return false;
        //duplicate number and not empty cell
        if (vals[a[i]] > 0 && a[i]!=empty)
            return false;
        //mark number as used  
        vals[a[i]]++;
    }
    return true;
}

现在是问题所在。如果使用-1或10(或其范围之外的任何数字)创建数独网格作为空单元格,则会返回arrayindexoutofbounds异常。我假设vals[a[i]]++是罪魁祸首,因为它试图添加一个不存在的数字。那么如何修复它,如果它不是一个空单元格,它只会添加数字?我试过了

if(a[i]!=empty)
   vals[a[i]]++;

但它给了我同样的错误。

我最初有

//secondary constructor, where e represents the empty cell
public Sudoku(int[][] g, int e){
    for(int i = 0; i < g.length; i++){
        for (int j = 0; j < g[0].length; j++){
            //for every instance of empty cell e, change to specific value
            if(g[i][j] == e){
                g[i][j] = 0;
            }
        }
    }
    theGrid = g;
}

会强制每个空单元格为0,而checkValues中只有a[i]!=0而不是a[i]!=empty,但由于一次使用{{1创建数独作为一个空单元格,但它实际上有-1。所以它应该返回false,但是返回true。

另外,如果使用仅带有1个参数0的构造函数创建它,有没有办法实现它,如果它有sudoku(int[][] g)则返回false,因为它没有被表示为空单元格。感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:0)

您应首先检查a[i]是否为空:

变化

if (vals[a[i]] > 0 && a[i]!=empty)
    return false;

if (a[i]!=empty && vals[a[i]] > 0)
    return false;

这利用&&(AND)运算符作为短路运算符 - 如果第一个(左)操作数是false,则不计算第二个(右)操作数,因此{{仅当vals[a[i]] > 0包含非空值时才会评估1}}。

在递增计数器之前,您还必须添加范围检查:

a[i]