懟一個數獨的算法

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();
    }
}
相關文章
相關標籤/搜索