你们有谁能告诉我这里做错了什么? 我想检查每个子网格中9,9平方的重复值。
我的方法首先通过创建每个子网格一维数组来工作,然后可以检查每个子网格的每一行。并且为了它去每个子网格我自己提供它的坐标。 它检查第一个网格0,0但不检查其他子网格的重复值。
谁能告诉我我做错了什么?public class SudokuPlayer
{
private int [][] game;
public enum CellState { EMPTY, FIXED, PLAYED };
private CellState[][] gamestate;
private int [][] copy;
private static final int GRID_SIZE=9;
private boolean whichGameToReset;
private int len;
private int stateSize;
private int row;
private int col;
private boolean coordinates(int startX, int startY)
{
row=startX;
col=startY;
if(isBoxValid()==false)
{
return false;
}
return true;
}
public boolean check()
{
if(coordinates(0,0)==false)
{
return false;
}
if(coordinates(0,3)==false)
{
return false;
}
if(coordinates(0,6)==false)
{
return false;
}
if(coordinates(1,0)==false)
{
return false;
}
if( coordinates(1,3)==false)
{
return false;
}
if( coordinates(1,6)==false)
{
return false;
}
if(coordinates(2,0)==false)
{
return false;
}
if(coordinates(2,3)==false)
{
return false;
}
if(coordinates(2,6)==false)
{
return false;
}
return true;
}
private boolean isBoxValid()
{
int[] arrayCopy = new int[game.length];
int currentRow = (row/3)*3;
int currentCol = (col/3)*3;
int i = 0;
for ( int r =currentRow; r < 3; r++)
{
for( int c =currentCol; c < 3; c++)
{
arrayCopy[i] = game[r][c];
i++;
}
}
for ( int p =0; p < arrayCopy.length; p++)
{
for ( int j = p+1; j < arrayCopy.length; j++)
{
if ( arrayCopy[p] == arrayCopy[j] && arrayCopy[j]!=0)
{
return false;
}
}
}
return true;
}
}
答案 0 :(得分:1)
问题出在你的isBoxValid()方法中。您正在分别将r
和c
初始化为currentRow
和currentCol
,但是您将循环运行到硬编码值3,而不是3+currentRow
或3+currentCol
。当currentRow和currentCol为0时,它工作正常,但对于其他数字,不是那么多。
哦,另一件关于编写简洁代码的好处:更容易看出你的错误在哪里。再看一下你硬编码到check()
的数字:你将列增加3并将行增加1.如果你将它压缩成一对{{{}那么会更容易发现1}}循环。