5
我最近一直在研究回溯数独求解算法,现在我想问一下我应该如何将我的solve()方法从void更改为布尔值。使用回溯的数独求解器
我用一个很简单的回溯算法,以及它目前工作正常,但我宁愿有一个布尔值,而不是无效的,因为有printstack是不是很好...
谢谢!
public class Backtracking{
static int backtrack = 0;
//check if valid in row
protected static boolean validInRow(int row, int value)
{
for(int col = 0; col < 9; col++)
if(board[row][col] == value)
return false ;
return true ;
}
//check if valid in column
protected static boolean validInCol(int col, int value)
{
for(int row = 0; row < 9; row++)
if(board[row][col] == value)
return false ;
return true ;
}
//check if valid in 3*3
protected static boolean validInBlock(int row, int col, int value)
{
row = (row/3) * 3 ;
col = (col/3) * 3 ;
for(int r = 0; r < 3; r++)
for(int c = 0; c < 3; c++)
if(board[row+r][col+c] == value)
return false ;
return true ;
}
//call other methods
public void solve(int row, int col) throws Exception
{
if(row > 8)
throw new Exception("Solution found") ;
else
{
while(board[row][col] != 0)
{
if(++col > 8)
{
col = 0 ;
row++ ;
if(row > 8)
throw new Exception("Solution found") ;
}
}
for(int value = 1; value < 10; value++)
{
if(validInRow(row,value) && validInCol(col,value) && validInBlock(row,col,value))
{
board[row][col] = value;
new PrintEvent(board);
if(col < 8)
solve(row, col + 1);
else
solve(row + 1, 0);
backtrack++;
}
}
board[row][col] = 0;
}
}
}
+1为try catch。我已经完成了一些编程竞赛,我使用try-catch原理来进行回溯。这不是一个优雅的黑客,但它非常有用。 – 2012-03-16 00:44:48
非常感谢我的朋友,我试图改变它很多次,但总是徒劳(看起来好像我搞砸了回报声明)。我做了你所做的一切,它就像一个魅力! – kompsci 2012-03-16 00:46:57