回溯算法解数独问题(java版)

2022-10-11 08:06:20

一直不太会数独问题,这次下决定搞明白,找到这篇文章,觉得说的真的很清楚,所以转下来啦。


转自:http://blog.csdn.net/tianyaleixiaowu/article/details/50912924


下面来详细讲一下如何用回溯算法来解数独问题。

    下图是一个数独题,也是号称世界上最难的数独。当然了,对于计算机程序来说,只要算法是对的,难不难就不知道了,反正计算机又不累。回溯算法基本上就是穷举,解这种数独类的问题逻辑比较简单。


不管算法懂不懂,先把类建出来,变量定义好,那放大学试卷上就是可以拿两分了。

  1. package shudu;
  2. /**
  3.  * Created by wolf on 2016/3/17.
  4.  */
  5. publicclass Sudoku {
  6. privateint[][] matrix;
  7. public Sudoku(int[][] matrix) {
  8. this.matrix = matrix;
  9.     }
  10. publicstaticvoid main(String[] args) {
  11. // 号称世界上最难数独
  12. int[][] sudoku = {
  13.                 {8,0,0,0,0,0,0,0,0},
  14.                 {0,0,3,6,0,0,0,0,0},
  15.                 {0,7,0,0,9,0,2,0,0},
  16.                 {0,5,0,0,0,7,0,0,0},
  17.                 {0,0,0,0,4,5,7,0,0},
  18.                 {0,0,0,1,0,0,0,3,0},
  19.                 {0,0,1,0,0,0,0,6,8},
  20.                 {0,0,8,5,0,0,0,1,0},
  21.                 {0,9,0,0,0,0,4,0,0}};
  22.         Sudoku s =new Sudoku(sudoku);
  23.         s.backTrace(0,0);
  24.     }
  25. /**
  26.      * 数独算法
  27.      * @param i
  28.      * 行号
  29.      * @param j
  30.      * 列号
  31.      */
  32. privatevoid backTrace(int i,int j) {
  33.     }
  34. }

    用一个二维数组来存储这个矩阵,然后定义一个方法来计算。方法里有两个属性——行号和列号。

    我们的原理就是从第0行0列开始,依次往里面填入1-9之间的数字,然后判断填入的这个数字是否能放进去(该行该列和它所在的小九宫格是否有重复数字)。如果能放进去,那么就继续用1-9去试该行的下一列。一直到该行的最后一列,然后换行继续重复上面的步骤(也就是执行backTrace方法)。一直执行到最后一个空格,也就是i=8,j=8的时候,且最后这个空格所放的值也完全符合规则,那么此时就算完成,不用再继续调用backTrace方法了,输出正确解即可。

所以回溯法样子看起来是这样的。给第一个空格填1-9中任何一个,开始判断,如果OK,然后进入下一层,如果不OK,就断掉了。下一层还是从1-9开始试,然后OK,不OK……当最终目标达到时,空格已填满又满足条件,那么中断该分支,输出结果。

    继续我们的程序。

    由于有些位置已经有数字了,所以我们需要判断,如果该坑已经有人蹲了,那么就把列号j加1,进入下一列。如果到第8列了,就换行。

    修改程序如下:

  1. package shudu;
  2. /**
  3.  * Created by wolf on 2016/3/17.
  4.  */
  5. publicclass Sudoku {
  6. privateint[][] matrix;
  7. public Sudoku(int[][] matrix) {
  8. this.matrix = matrix;
  9.     }
  10. publicstaticvoid main(String[] args) {
  11. // 号称世界上最难数独
  12. int[][] sudoku = {
  13.                 {8,0,0,0,0,0,0,0,0},
  14.                 {0,0,3,6,0,0,0,0,0},
  15.                 {0,7,0,0,9,0,2,0,0},
  16.                 {0,5,
  • 作者:iCoding91
  • 原文链接:https://blog.csdn.net/caoxiaohong1005/article/details/78271088
    更新时间:2022-10-11 08:06:20