我目前正在编写一些代码,用于解决分配的数独谜题。我目前编写的代码应该是隔离我们需要插入值的行和列,然后测试值1-9以查看哪些已经出现在行或列中。问题是,二进制搜索没有检测到一些数字,我不知道为什么。这是我的代码。你需要的只是A.grid是一个包含未解决的谜题的数组,而set值方法是我编写的用于将值插入数组并使用fromat setValue(xLocation,yLocation,value)
int currentVal = 0;
int j;
int [] currentRow = new int [9];
int [] currentCol = new int [9];
for (i = 0; i<9 ; i++) {
for (j = 0; j<9 ; j++){
currentVal=A.grid[i][j];
boolean keepGoing = true;
int newVal=1;
if (currentVal==0) {
for( int k = 0; k < 9; k++)
{currentCol[k] = A.grid[k][j];
}
currentRow = A.grid[i];
log(Arrays.toString(currentRow));
log(Arrays.toString(currentCol));
log("");
while (keepGoing) {
int indexRow=Arrays.binarySearch(currentRow, newVal);
int indexCol=Arrays.binarySearch(currentCol, newVal);
log(indexRow);
log(indexCol);
log("");
if (indexRow<0 && indexCol<0) {
keepGoing = false;
}
newVal++;
}
A.setValue(j, i, newVal-1);
谢谢!
答案 0 :(得分:0)
我不确定这是否是您唯一的问题,但如果您要使用二进制搜索算法,则需要确保对数组进行排序。否则,你将获得垃圾结果。
话虽如此,为什么你认为你需要在只有9个元素的数组上进行二进制搜索?只需手动进行搜索并忘记使用二进制搜索就可能更快。
int indexRow = -1;
for (int z = 0; z < 9; ++z)
{
if (currentRow[z] == newVal)
{
indexRow = z;
break;
}
}
// indexRow is now the index of newVal in currentRow
就此而言,如果将整个例程包含在一个单独的函数中,那么可能会更清楚:
int search(int[] source, int val)
{
for (int z = 0; z < source.length; ++z)
{
if (source[z] == val)
{
// z is the position of val in the source array
return z;
}
}
// Return -1 if val is not present
return -1;
}
然后,您将使用对search()的调用替换您的binarySearch()调用。
我希望这有帮助!