我认为标题可能会让它听起来更容易。
基本上我必须检查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,因为它没有被表示为空单元格。感谢任何帮助,谢谢
答案 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]