gpt4 book ai didi

java - 使用回溯的数独解算器

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:52 25 4
gpt4 key购买 nike

我最近一直在研究回溯数独求解算法,目前我想问一下我应该如何将我的 solve() 方法从 void 更改为 boolean 值。

我正在使用一个非常简单的回溯算法,它目前工作正常,但我宁愿使用 boolean 值而不是 void,因为打印堆栈不是很好...

谢谢!

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;

}
}
}

最佳答案

好吧,您可以捕获 异常以避免堆栈跟踪,但这仍然不是很漂亮。将返回类型更改为 boolean 后,您可以做的是:

       if( col < 8 ) {
if (solve(row, col + 1)) {
return true;
}
} else {
if (solve(row + 1, 0)) {
return true;
}
}

然后当然,将 throw 语句更改为 return true;

关于java - 使用回溯的数独解算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9730280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com