题解 | #Sudoku#

Sudoku

http://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1

import java.util.*;

public class Main{

    public static void main(String[] agrs) {

        Scanner scan = new Scanner(System.in);

        int[][] a = new int[9][9];
        for (int i = 0; i < 9; i ++) {
            for (int j = 0; j < 9; j ++) {
                a[i][j] = scan.nextInt();
            }
        }

        resolve(a);

        for (int i = 0; i < 9; i ++) {
            for (int j = 0; j < 9; j ++) {
                System.out.print(a[i][j] + " ");
            }
            System.out.println();
        }
    }

    private static boolean resolve(int[][] a) {
        for (int i = 0; i < 9; i ++) {
            for (int j = 0; j < 9; j ++) {

                /**
                 * 对于空缺的位置从 1-9 依次填入,如果 1-9 符合数独规则
                 *         则基于此尝试递归解决数独,否则回溯
                 */
                if (a[i][j] == 0) {
                    for (int k = 1; k < 10; k ++) {
                        a[i][j] = k;

                        // 校验数独规则
                        if (check(i, j, k, a)) {

                            // 规则符合则递归解决数独
                            if (resolve(a)) {

                                // 数独解决
                                return true;
                            }
                        }

                        // 回溯
                        a[i][j] = 0;
                    }

                    // 9 个数字尝试完都不行则该数独无法解决
                    return false;
                }
            }
        }

        // 没有数字为 0,即数独已经解决
        return true;
    }

    private static boolean check(int i, int j, int v, int[][] a) {

        return checkI(i, j, a) && checkJ(i, j, a) && checkS(i, j, a);
    }

    private static boolean checkI(int i, int j, int[][] a) {
        for (int index = 0; index < 9; index ++) {
            if (index != j && a[i][index] == a[i][j]) {
                return false;
            }
        }
        return true;
    }

    private static boolean checkJ(int i, int j, int[][] a) {
        for (int index = 0; index < 9; index ++) {
            if (index != i && a[index][j] == a[i][j]) {
                return false;
            }
        }
        return true;
    }

    private static boolean checkS(int i, int j, int[][] a) {
        int imin = (i / 3) * 3;
        int jmin = (j / 3) * 3;
        for (int x = imin; x < imin + 3; x ++) {
            for (int y = jmin; y < jmin + 3; y ++) {
                if (x != i && j != i && a[x][y] == a[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }
}

全部评论

相关推荐

身边有人上海、深圳&nbsp;6、7k&nbsp;都去了,真就带薪上班了。
程序员小白条:木的办法, 以后越来越差,还是家附近宅着吧,毕业的人越来越多,岗位都提供不出来,经济又过了人口红利期
点赞 评论 收藏
分享
点赞 评论 收藏
分享
06-26 22:20
门头沟学院 Java
码农索隆:让你把简历发给她,她说一些套话,然后让你加一个人,说这个人给你改简历,然后开始卖课
我的求职精神状态
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务