java – 使用回溯的数独求解器

我最近一直致力于回溯数独求解算法,目前我想询问我应该如何将我的solve()方法从void更改为boolean.

我正在使用一个非常简单的回溯算法,它目前工作正常,但我宁愿有一个布尔值而不是一个空格,因为有一个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;

      }
   }
 }
最佳答案
好吧,你可以捕获异常以避免堆栈跟踪,但这仍然不是很漂亮.将返回类型更改为boolean后可以执行的操作是:

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

然后,当然,更改throw语句以返回true;.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...