【问题标题】:sudoku solver using backtracking使用回溯的数独求解器
【发布时间】:2012-03-16 00:38:47
【问题描述】:

我最近一直在研究回溯数独求解算法,目前我想问一下我应该如何将我的 solve() 方法从 void 更改为 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;

      }
   }
 }

【问题讨论】:

    标签: java sudoku solver


    【解决方案1】:

    好吧,你可以catch 异常来避免堆栈跟踪,但这仍然不是很漂亮。将返回类型改为boolean后可以做的事情是:

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

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

    【讨论】:

    • +1 表示 try catch。我参加过一些编程比赛,我使用 try-catch 原则进行回溯。这不是一个优雅的 hack,但它非常有用。
    • 非常感谢我的朋友,我尝试更改了很多次,但总是徒劳无功(好像我搞砸了 return 语句)。我做了你所做的,它就像一个魅力!
    【解决方案2】:
    public boolean solve(int row, int col) throws Exception
    {
      {
    
         while(board[row][col] != 0)
         {
            if( ++col > 8 )
            {
               col = 0 ;
               row++ ;
    
    
               if( row > 8 )
                 return true
            }
         }
    
    
         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;
    
          }
       }
    return false;
     }
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多