兴趣来了,写了个简单的数独游戏计算程序,未做算法优化。

通过文件来输入一个二维数组,9行,每行9个数组,数独游戏中需要填空的地方用0来表示。结果也是打印二维数组。

 1 import java.io.File;
 2 import java.util.List;
 3 //代表数独中的一个单元格位置
 4 public class Cell {
 5 
 6     // 所在行
 7     public int row;
 8     // 所在列
 9     public int colum;
10     //
11     public int value;
12 
13     public static int rowMax = 9;
14 
15     public static int columMax = 9;
16 
17     public static Cell[][] pan = new Cell[rowMax][columMax];
18 
19     // 初期化数独游戏
20     public static void init() {
21         // 数独盘上的值输入下面文件中,共9行,每行9个数字
22         // 0表示需要计算的空着的区域,
23         // eg:
24         // -----------------------
25         // 008309100
26         // 900060004
27         // 007504800
28         // 036000540
29         // 001000600
30         // 042000970
31         // 005907300
32         // 600010008
33         // 004608200
34         // -------------------------
35         File f = new File("conf/sd.txt");
36         List<List<Integer>> list = SDUtil.initQiPan(f);
37         for (int i = 0; i < rowMax; i++) {
38             for (int j = 0; j < columMax; j++) {
39                 pan[i][j] = new Cell(i, j);
40                 pan[i][j].value = list.get(i).get(j);
41             }
42         }
43     }
44 
45     // 取得下一个需要计算的位置
46     public Cell getNext() {
47         Cell next = null;
48         int row = 0;
49         int colum = 0;
50         if (this.row + 1 < rowMax) {
51             row = this.row + 1;
52             colum = this.colum;
53         } else if (this.colum + 1 < columMax) {
54             row = 0;
55             colum = this.colum + 1;
56         } else {
57             return null;
58         }
59         next = pan[row][colum];
60         return next;
61     }
62 
63     private Cell(int row, int colum) {
64         this.row = row;
65         this.colum = colum;
66     }
67 
68 }
 1 import java.io.BufferedReader;
 2 import java.io.File;
 3 import java.io.FileReader;
 4 import java.util.ArrayList;
 5 import java.util.List;
 6 
 7 public class SDUtil {
 8 
 9     //把配置文件转换成二维列表
10     public static List<List<Integer>> initQiPan(File f) {
11         List<List<Integer>> list = new ArrayList<List<Integer>>();
12         try {
13             BufferedReader br = new BufferedReader(new FileReader(f));
14             String s;
15             while ((s = br.readLine()) != null) {
16                 s = s.trim();
17                 char[] car = s.toCharArray();
18                 List<Integer> l = new ArrayList<Integer>();
19                 for (int i = 0; i < 9; i++) {
20                     l.add(Integer.parseInt("" + car[i]));
21                 }
22                 list.add(l);
23             }
24             br.close();
25         } catch (Exception e) {
26             e.printStackTrace();
27         }
28         return list;
29     }
30 }
  1 import java.util.ArrayList;
  2 import java.util.Arrays;
  3 import java.util.List;
  4 
  5 public class ShuDu {
  6 
  7     static List<String> allNum = Arrays.asList("1", "2", "3", "4", "5", "6",
  8             "7", "8", "9");
  9 
 10     public static void main(String[] args) {
 11         begin();
 12 
 13     }
 14 
 15     public static void begin() {
 16         //初期化,数独中原有的数字装入
 17         Cell.init();
 18         //第一个位置取得
 19         Cell beginCell = Cell.pan[0][0];
 20         //计算
 21         insertCell(beginCell);
 22     }
 23 
 24     //打印结果
 25     public static void printOkValue() {
 26         for (int i = 0; i < Cell.rowMax; i++) {
 27             for (int j = 0; j < Cell.columMax; j++) {
 28                 System.out.print(Cell.pan[i][j].value + "    ");
 29             }
 30             System.out.println();
 31         }
 32     }
 33 
 34     //计算并插入正确的值(主要逻辑方法)
 35     public static boolean insertCell(Cell cell) {
 36         if (cell.value == 0) {
 37             List<String> canList = getCanInList(cell.row, cell.colum);
 38             if (canList.size() == 0) {
 39                 return false;
 40             }
 41             for (String can : canList) {
 42                 cell.value = Integer.parseInt(can);
 43                 Cell nextCell = cell.getNext();
 44                 if (nextCell != null) {
 45                     boolean b = insertCell(nextCell);
 46                     if (b) {
 47                         return true;
 48                     }
 49                 } else {
 50                     printOkValue();
 51                     System.exit(0);
 52                     ;
 53                 }
 54             }
 55             cell.value = 0;
 56         } else {
 57             Cell nextCell = cell.getNext();
 58             if (nextCell != null) {
 59                 boolean b = insertCell(nextCell);
 60                 if (b) {
 61                     return true;
 62                 }
 63             } else {
 64                 printOkValue();
 65                 System.exit(0);
 66                 ;
 67             }
 68         }
 69 
 70         return false;
 71     }
 72 
 73     //取得所在位置的所有可能数字列表
 74     public static List<String> getCanInList(int row, int colum) {
 75         List<String> canList = new ArrayList<String>();
 76         canList.addAll(allNum);
 77         lineValidate(canList, row, colum, Cell.columMax);
 78         columValidate(canList, row, colum, Cell.rowMax);
 79         blockValidate(canList, row, colum);
 80         return canList;
 81     }
 82 
 83     //行验证
 84     public static void lineValidate(List<String> set, int row, int colum,
 85             int max) {
 86         for (int i = 0; i < max; i++) {
 87             String value = Cell.pan[row][i].value + "";
 88             if (value.equals("0")) {
 89                 continue;
 90             }
 91             set.remove(value);
 92         }
 93     }
 94 
 95     //列验证
 96     public static void columValidate(List<String> set, int row, int colum,
 97             int max) {
 98         for (int i = 0; i < max; i++) {
 99             String value = Cell.pan[i][colum].value + "";
100             if (value.equals("0")) {
101                 continue;
102             }
103             set.remove(value);
104         }
105     }
106 
107     //所求位置所在的9个块验证
108     public static void blockValidate(List<String> canList, int row, int colum) {
109         int blockRow = row / 3 * 3;
110         int blockColum = colum / 3 * 3;
111         for (int i = 0 + blockRow; i < 3 + blockRow; i++) {
112             for (int j = 0 + blockColum; j < 3 + blockColum; j++) {
113                 String value = Cell.pan[i][j].value + "";
114                 if (value.equals("0")) {
115                     continue;
116                 }
117                 canList.remove(value);
118             }
119         }
120     }
121 }