package com.evan; /**英語1.8級 湊合看**/ public class ShuDu { /** * 驗證(x,y)的位置是否能填寫num * * @param x * @param y * @param num */ public static boolean check(int x, int y, int num) { // (x,y)對應的數字必須爲0 if (array[x][y] != 0) { return false; } // 先肯定(x,y)所在的區域 int xs = (x / 3) * 3; int ys = (y / 3) * 3; int xe = xs + 3; int ye = ys + 3; // System.out.println("("+xs+","+ys+")~("+xe+","+ye+")"); // 所在九宮格中是否存在 for (int xx = xs; xx < xe; xx++) { for (int yy = ys; yy < ye; yy++) { if (array[xx][yy] == num) {// 存在,不能寫入至(x,y) return false; } } } // 所在行是否存在 for (int yy = 0; yy < array[x].length; yy++) { if (array[x][yy] == num) {// 存在,不能寫入至(x,y) return false; } } // 所在列是否存在 for (int xx = 0; xx < array.length; xx++) { if (array[xx][y] == num) {// 存在,不能寫入至(x,y) return false; } } // 所在行、列、格都不存在num // 再驗證 所在行、列、格的其餘位置是否能夠填寫num for (int yy = 0; yy < array[x].length; yy++) { if (array[x][yy] == -1) { return true; } } for (int xx = 0; xx < array[x].length; xx++) { if (array[xx][y] == -1) { return true; } } for (int xx = xs; xx < xe; xx++) { for (int yy = ys; yy < ye; yy++) { if (array[xx][yy] == -1) { return true; } } } array[x][y] = -1; boolean check = false; // 若是所在行的其餘位置不能填寫num,則(x,y)將寫入num for (int yy = 0; yy < array[x].length; yy++) { if (yy != y && array[x][yy] == 0) { check = check(x, yy, num); if (check) { array[x][y] = 0; break; } } } if (!check) { // 所在行的其餘位置不能填寫num,則(x,y)將寫入num array[x][y] = num; print.append((x + 1) + "行," + (y + 1) + "列 = " + num + "\n"); System.out.println((x + 1) + "行," + (y + 1) + "列 = " + num); pirnt(); return true; } array[x][y] = -1; check = false; // 若是所在列的其餘位置不能填寫num,則(x,y)將寫入num for (int xx = 0; xx < array[x].length; xx++) { if (xx != x && array[xx][y] == 0) { check = check(xx, y, num); if (check) { array[x][y] = 0; break; } } } if (!check) { // 所在行的其餘位置不能填寫num,則(x,y)將寫入num array[x][y] = num; print.append((x + 1) + "行," + (y + 1) + "列 = " + num + "\n"); System.out.println((x + 1) + "行," + (y + 1) + "列 = " + num); pirnt(); return true; } array[x][y] = -1; check = false; // 若是所在格的其餘位置不能填寫num,則(x,y)將寫入num for (int xx = xs; xx < xe; xx++) { if (check) { break; } for (int yy = ys; yy < ye; yy++) { if (array[xx][yy] == 0) { check = check(xx, yy, num); if (check) { array[x][y] = 0; break; } } } } if (!check) { // 所在行的其餘位置不能填寫num,則(x,y)將寫入num array[x][y] = num; print.append((x + 1) + "行," + (y + 1) + "列 = " + num + "\n"); System.out.println((x + 1) + "行," + (y + 1) + "列 = " + num); pirnt(); return true; } return false; } public static int[][] array = new int[9][9]; public static StringBuilder print = new StringBuilder(); public static void toArray(String s) { if (s == null || s.length() != 81) { return; } for (int idx = 0; idx < 81; idx++) { int n = s.charAt(idx) - '0'; int x = idx / 9; int y = idx % 9; array[x][y] = n; } } public static void pirnt() { for (int x = 0; x < array.length; x++) { for (int y = 0; y < array[x].length; y++) { System.out.print(array[x][y] + ", "); } System.out.println(); } } public static boolean comp() { for (int x = 0; x < array.length; x++) { for (int y = 0; y < array[x].length; y++) { if (array[x][y] == 0) { return false; } } } return true; } public static void handel() { while (true) { if (comp()) { break; } else { for (int x = 0; x < array.length; x++) { for (int y = 0; y < array[x].length; y++) { if (array[x][y] == 0) { for (int n = 1; n < 10; n++) { check(x, y, n); } } } } } } System.out.println("==========================================="); System.out.println(print); } public static void main(String[] args) { toArray("000500060809000010160087000300026000007010600000850003000470021040000908080003000"); handel(); } }