解决数独计划

时间:2012-08-04 05:55:45

标签: java loops sudoku

我这里有问题。我没有得到完美的输出。以下是我为编写Sudoku而编写的代码。即使我知道它的原因,因为它无法创建任何新的唯一编号,它打印默认值为0.我知道我错过了一些我无法想到的东西。任何人都可以建议一个解决方案吗?提前致谢。

public class FinalSudoku 
{
    int a[][]=new int[9][9];
    public void initialize1()
    {
        for(int i=0;i<9;i++)
        {
         for(int j=0;j<9;j++)
        {
             a[i][j]=0;
        }

     }
    }
    protected boolean detectRow( int row, int num )
       {
          for( int col = 0; col < 9; col++ )
             if( a[row][col] == num )
                return false;

          return true ;
       }

    protected boolean detectCol( int col, int num )
       {
          for( int row = 0; row < 9; row++ )
             if( a[row][col] == num )
                return false ;

          return true ;
       }

    protected boolean detectBox( int row, int col, int num )
       {
          row = (row / 3) * 3 ;
          col = (col / 3) * 3 ;

          for( int r = 0; r < 3; r++ )
             for( int c = 0; c < 3; c++ )
             if( a[row+r][col+c] == num )
                return false ;

          return true ;
       }

    public void solve( int row, int col ) throws Exception
    {
        if( row > 8 )
             throw new Exception( "Solution found" ) ;

        if( a[row][col] != 0 )
             next( row, col ) ;
          else
          {
    for( int num = 1; num < 10; num++ )
    {
       if(detectRow(row,num) && detectCol(col,num) && detectBox(row,col,num) )
       {
          a[row][col] = num ;
          next(row, col) ;
       }
    }
          }
    }
    public void display()
    { 
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                System.out.print(a[i][j]+" ");
            }
            System.out.println();
        }
    }

    public void next( int row, int col ) throws Exception
       {
          if( col < 8 )
             solve( row, col + 1 ) ;
          else
             solve( row + 1, 0 ) ;
       }  
    public static void main(String[] args) throws Exception
    {
        FinalSudoku fs = new FinalSudoku();
        fs.initialize1();

        fs.solve(0,0);

        fs.display();
    }

}

此代码的输出:

1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 3 2 1
7 8 9 1 2 3 4 5 6
2 1 4 3 6 5 8 9 7
3 6 7 2 9 8 1 4 5
5 9 8 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0

2 个答案:

答案 0 :(得分:6)

你不是在写一个求解器,而是一个生成器。你的问题是你填写了值,而没有真正检查它们是否会阻止这个难题。看看算法停止的地方。

1 2 3  4 5 6  7 8 9
4 5 6  7 8 9  3 2 1
7 8 9  1 2 3  4 5 6

2 1 4  3 6 5  8 9 7
3 6 7  2 9 8  1 4 5
5 9 8  0 0 0  0 0 0 < This row contains 5 and 8, 9

0 0 0  0 0 0  0 0 0
0 0 0  0 0 0  0 0 0
0 0 0  0 0 0  0 0 0
       ^
 This column contains 1,2,3,4 and 7

 And the center box, contains 6

所以所有号码都是为那个地方拍摄的。


看看这里:Wiki: Sudoku algorithms: Blank Sudoku grids
这段代码产生一个填充的网格,这可能是有趣的开始?


感谢Alex D,他的优点是:

如果你真的想要像你想要的那样使用强力算法,你需要备份它并在它到达无法成功的点时尝试不同的解决方案。如果它一直支持到开头,没有任何选择可以尝试,那么就没有解决方案。有几种标准方法可以实现这种“带回溯的递归搜索”。

这种求解算法可行,但需要一些递归知识。

答案 1 :(得分:0)

此代码检查Sudoku。如果它是正确的,那么check_sudoku()方法如果错误则返回true,然后显示具有重复元素的行号和列号。

SELECT 
    *
FROM
    `pages`
WHERE
    (DATE_FORMAT(CONVERT_TZ(`created_at`, '+00:00', '+05:00'),
            '%Y-%m-%d')) BETWEEN '2017-05-01' AND '2017-05-30'

}