题解 | #Sudoku#

Sudoku

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

import java.util.*;

public class Main {
    static int[][] arr;//记录当前盘面
    static boolean[][] booleans;//记录哪些数据要修改的

    public static void main(String[] args) {
        //初始化数据
        arr = new int[9][9];
        booleans = new boolean[9][9];
        //读取数据
        Scanner in = new Scanner(System.in);
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                int input = in.nextInt();
                arr[i][j] = input;
                if (input == 0) {
                    booleans[i][j] = true;
                }
            }
        }
        //深度搜索
        dfs(0, 0);
    }

    private static void dfs(int i, int j) {
        //边界条件
        if (i == 9 && j == 0) {
            //输出最后结果
            for (int p = 0; p < 9; p++) {
                for (int q = 0; q < 9; q++) {
                    System.out.print(arr[p][q] + " ");
                }
                System.out.println("");
            }
            System.exit(0);
        }
        //进一步搜索
        if (arr[i][j] == 0) {
            //查找可能的数据
            ArrayList<Integer> list = getList(i, j);
            if (list.size() == 0) {//如果找不到数字,回溯
                return;
            } else {
                for (int i1 = 0; i1 < list.size(); i1++) {
                    arr[i][j] = list.get(i1);
                    //进一步搜索
                    int nextRow;
                    int nextCol;
                    if (j + 1 == 9) {
                        nextRow = i + 1;
                        nextCol = 0;
                    } else {
                        nextRow = i;
                        nextCol = j + 1;
                    }
                    dfs(nextRow, nextCol);
                }
                //遍历完毕之后回溯
                arr[i][j] = 0;
            }
        } else {
            //进一步搜索
            int nextRow;
            int nextCol;
            if (j + 1 == 9) {
                nextRow = i + 1;
                nextCol = 0;
            } else {
                nextRow = i;
                nextCol = j + 1;
            }
            dfs(nextRow, nextCol);
        }
    }

    private static ArrayList<Integer> getList(int i, int j) {
        Integer[] integers = new Integer[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
        List<Integer> list = Arrays.asList(integers);
        ArrayList<Integer> integers1 = new ArrayList<>(list);
        //行和列的数据
        for (int i1 = 0; i1 < 9; i1++) {
            integers1.remove((Integer) arr[i1][j]);
            integers1.remove((Integer) arr[i][i1]);
        }
        //九宫格内的数字
        int row = 0;
        int col = 0;
        if (i >= 0 && i <= 2) {
            row = 0;
        } else if (i >= 3 && i <= 5) {
            row = 3;
        } else if (i >= 6 && i <= 8) {
            row = 6;
        }
        if (j >= 0 && j <= 2) {
            col = 0;
        } else if (j >= 3 && j <= 5) {
            col = 3;
        } else if (j >= 6 && j <= 8) {
            col = 6;
        }
        for (int i1 = row; i1 < row + 3; i1++) {
            for (int i2 = col; i2 < col + 3; i2++) {
                integers1.remove((Integer) arr[i1][i2]);
            }
        }
        return integers1;
    }
}

解题思路:

1, 采用深度搜索算法, 对每个方格尝试填入数字;

2, 不断深入,如果发现有格子没有数字可填, 则说明上一步的猜测有误, 则进行回溯;

3, 直到所有格子都填进数字, 说明已经找到了结果, 就进行输出, 然后终止程序

全部评论

相关推荐

在笔试的大西瓜很矫健:校招数分不用想了,这经历和学历都不够用,大厂更别想,初筛都过不了,说点不好听的小厂数分都进不去(小厂也是假数分),要两个对口实习+3个项目(或者3+2),而且要有含金量才能补一点你的学历劣势。 建议刷实习,社招找数分,校招看运气,能入行业就行,可以运营转数分
点赞 评论 收藏
分享
02-14 16:34
门头沟学院 Java
YukiYukino:爽啊,福报,三年前我拿了offer不去,读研出来门槛也变高了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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