题解 | #Sudoku#

Sudoku

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

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        char[][] borad = new char[9][9];
        String str = "";
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            for (int i = 0; i < borad.length; i++) {
                borad[i] = in.nextLine().replaceAll(" ", "").toCharArray();
            }
            dfs(borad);
            for (int i = 0; i < borad.length; i++) {
                for (int j = 0; j < borad[0].length; j++) {
                    System.out.print(borad[i][j] + " ");
                }
                System.out.println();
            }
        }
        in.close();
    }

    private static boolean dfs(char[][] borad) {

        // 行
        for (int i = 0; i < borad.length; i++) {
            // 列
            for (int j = 0; j < borad[0].length; j++) {
                if (borad[i][j] != '0') {
                    continue;
                }

                for (char c = '1'; c <= '9'; c++) {
                    if (isValid(i, j, c, borad)) {
                        borad[i][j] = c;
                        if (dfs(borad)) {
                            return true;
                        }
                        borad[i][j] = '0';
                    }
                }
                return false;
            }
        }
        return true;
    }


    /**
     * 校验有效值
     * @param row 行
     * @param col 列
     * @param val 填充值
     * @param borad 9X9数独
     * @return
     */
    private static boolean isValid(int row, int col, int val, char[][] borad) {
        //行
        for (int i = 0; i < 9; i++) {
            if (borad[row][i] == val) {
                return false;
            }
        }
        // 列
        for (int i = 0; i < 9; i++) {
            if (borad[i][col] == val) {
                return false;
            }
        }
        // 每个3X3格子
        int startRow = (row / 3) * 3;
        int startCol = (col / 3) * 3;
        for (int i = startRow; i < startRow + 3; i++) {
            for (int j = startCol; j < startCol + 3; j++) {
                if (borad[i][j] == val) {
                    return false;
                }
            }
        }

        return true;
    }
}

#数独#
全部评论

相关推荐

舂锋:不能投什么岗都用一份简历,一般都是要看企业的岗位需求来写职业技能或者是项目经历,跟岗位相关的就写多一点。
点赞 评论 收藏
分享
05-23 19:02
吉林大学 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 10:56
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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