Poj2676

经典DFS现在看来nice啊!

 1 package SoduKu;
 2 
 3 import java.io.InputStreamReader;
 4 import java.util.Scanner;
 5 /*
 6  *我用row[k][i]表示第k行是否已经有数i
 7  *col[k][i]表示第k列是否已经有数i
 8  *而sq[k][i]表示第k个九宫格是否有数i(这里k=(x/3)*3+(y/3),可以想想为什么)
 9  *从0,0 依次搜到8,8  DFS依次往下
10  **/
11 public class Poj2676{
12 
13     static int[][] map = new int[9][9];
14     static int[][] col = new int[9][9];
15     static int[][] row = new int[9][9];
16     static int[][] sq  = new int[9][9];
17     static boolean isFind = false;
18     static void fill(int[][] a){
19         for(int i = 0; i < 9; ++i){
20             for(int j = 0; j < 9; ++j)
21                 a[i][j] = 0;
22         }
23     }
24     static void print(){
25         for(int i = 0; i < 9; ++i) {
26             for(int j = 0; j < 9; ++j){
27                 System.out.print(map[i][j]+1);
28             }
29             System.out.println();
30         }
31     }
32 
33     static void dfs(int x, int y){
34         int u = x*9 + y + 1;
35         if(x == 9){
36             isFind = true;
37             print();
38         }
39 
40         if(isFind)
41             return;
42         if(map[x][y] != -1){
43             dfs(u/9, u%9);
44             return;
45         }
46 
47         for(int i = 0; i < 9 && !isFind; ++i){
48             int k = (x/3)*3 + y/3;
49             if(row[x][i] == 0 && col[y][i] == 0 && sq[k][i] == 0){
50                 row[x][i] = col[y][i] = sq[k][i] = 1;
51                 map[x][y] = i;
52 
53                 dfs(u/9, u%9);
54 
55                 row[x][i] = col[y][i] = sq[k][i] = 0;
56                 map[x][y] = -1;
57             }
58         }
59     }
60     public static void main(String[] args){
61         Scanner scanner = new Scanner(new InputStreamReader(System.in));
62 
63         int k;
64         int n = scanner.nextInt();
65         scanner.nextLine();
66         for(int ni = 1; ni <= n; ++ni){
67 
68             fill(map);
69             fill(row);
70             fill(col);
71             fill(sq);
72             isFind = false;
73             for(int i = 0; i < 9; ++i){
74                 String string = scanner.nextLine();
75                 for(int j = 0; j < 9; ++j) {
76                     k = string.charAt(j) - '0';
77                     map[i][j] = k-1;
78                     if(k != 0){
79                         row[i][k-1] = col[j][k-1] = sq[(i/3)*3 + (j/3)][k-1] = 1;
80                     }
81                 }
82             }
83             dfs(0, 0);
84         }
85     }
86 }
原文地址:https://www.cnblogs.com/ya-cpp/p/5323790.html