數獨-java版
阿新 • • 發佈:2019-02-12
求數獨問題
依然利用圖的深度優先搜尋演算法求解
直接上程式碼:
public class 數獨 {
public static void main(String[] args) {
String[][] map = {
{ "5", "3", " ", " ", "7", " ", " ", " ", " " },
{ "6", " ", " ", "1", "9", "5", " ", " ", " " },
{ " ", "9", "8", " ", " ", " ", " ", "6" , " " },
{ "8", " ", " ", " ", "6", " ", " ", " ", "3" },
{ "4", " ", " ", "8", " ", "3", " ", " ", "1" },
{ "7", " ", " ", " ", "2", " ", " ", " ", "6" },
{ " ", "6", " ", " ", " ", " ", "2", "8", " " },
{ " ", " ", " ", "4", "1", "9", " " , " ", "5" },
{ " ", " ", " ", " ", "8", " ", " ", "7", "9"}};
getResult(map);
System.out.println("結果:");
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map.length; j++) {
System.out.print(map[i][j] + " ");
if (j == map.length - 1) {
System.out.println();
}
}
}
}
private static boolean getResult(String[][] map) {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
if (map[i][j] == " ") {
for (int k = 1; k < 10; k++) {
map[i][j] = k + "";
if (isAvail(i, j, map) && getResult(map)) {
return true;
} else {
// 還原
map[i][j] = " ";
}
}
//當最後一個元素不滿足時,剪枝!
return false;
}
}
}
return true;
}
private static boolean isAvail(int x, int y, String[][] map) {
// 檢查x行
for (int j = 0; j < map.length; j++) {
if (j != y && map[x][j].equals(map[x][y])) {
return false;
}
}
// 檢查y列
for (int i = 0; i < map.length; i++) {
if (i != x && map[i][y].equals(map[x][y])) {
return false;
}
}
for (int i = 3 * (x / 3); i < 3 * (x / 3 + 1); i++) {
for (int j = 3 * (y / 3); j < 3 * (y / 3 + 1); j++) {
if ((i != x || j != y) && map[i][j].equals(map[x][y])) {
return false;
}
}
}
return true;
}
}
結果:
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9