leetcode刷题_解数独

题目描述

在这里插入图片描述
在这里插入图片描述

Java解决方法

我写的代码总是出不来正确结果,不知道为啥,有小伙伴可以解答的吗?

class Solution {
    
    
    public void solveSudoku(char[][] board) {
    
    
        //用一个三维数组即可解决,第三维0~2,代表行/列/子空间
        //第一维0~8,代表第n行/列/子空间
        //第二维0~8,代表1~9对应的数字
        //其值代表行/列/子空间 的第n行/列/子空间 的1~9对应的数字 的出现的次数。次数初始化为0
        int[][][] str = new int[9][9][3];
        for(int i = 0;i < 9;i++)
        {
    
    
            for(int j = 0;j < 9;j++)
            {
    
    
                int vl = board[i][j] - '1';
                if(vl >= 0 && vl <= 8)
                {
    
    
                    str[i][vl][0] = 1;
                    str[j][vl][1] = 1;
                    str[j / 3 + (i / 3) * 3][vl][2] = 1;
                }
            }
        }
        fill(str,0,0,board);
    }

    private boolean fill(int[][][] str,int x,int y,char[][] board)
    {
    
    
        if(y == 9)
        {
    
    
            y = 0;
            x++;
            if(x == 9)
            {
    
    
                return true;
            }
        }
        if(board[x][y] == '.')
        {
    
    
            //依次尝试填入的数是否合法
            for(int i = 1;i < 10;i++)
            {
    
                  

                if(str[x][i-1][0] == 0 && str[y][i-1][1] == 0 && str[y / 3 + (x / 3) * 3][i-1][2] == 0)
                {
    
    
                    board[x][y] = (char)('0' + i);
                    str[x][i-1][0] = 1;
                    str[y][i-1][1] = 1;
                    str[y / 3 + (x / 3) * 3][i-1][2] = 1;
                    if(fill(str,x,y + 1,board))
                    {
    
    
                        return true;
                    }
                }
                board[x][y] = '.';
                str[x][i-1][0] = 0;
                str[y][i-1][1] = 0;
                str[y / 3 + (x / 3) * 3][i-1][2] = 0;
            }
        }
        else
        {
    
    
            return fill(str,x,y + 1,board);
        }
        return false;
    }
}

以下粘贴是别人的:

class Solution {
    
    
    public void solveSudoku(char[][] board) {
    
    
        // 三个布尔数组 表明 行, 列, 还有 3*3 的方格的数字是否被使用过
        boolean[][] rowUsed = new boolean[9][10];
        boolean[][] colUsed = new boolean[9][10];
        boolean[][][] boxUsed = new boolean[3][3][10];
        // 初始化
        for(int row = 0; row < board.length; row++){
    
    
            for(int col = 0; col < board[0].length; col++) {
    
    
                int num = board[row][col] - '0';
                if(1 <= num && num <= 9){
    
    
                    rowUsed[row][num] = true;
                    colUsed[col][num] = true;
                    boxUsed[row/3][col/3][num] = true;
                }
            }
        }
        // 递归尝试填充数组 
        recusiveSolveSudoku(board, rowUsed, colUsed, boxUsed, 0, 0);
    }
    
    private boolean recusiveSolveSudoku(char[][]board, boolean[][]rowUsed, boolean[][]colUsed, boolean[][][]boxUsed, int row, int col){
    
    
        // 边界校验, 如果已经填充完成, 返回true, 表示一切结束
        if(col == board[0].length){
    
    
            col = 0;
            row++;
            if(row == board.length){
    
    
                return true;
            }
        }
        // 是空则尝试填充, 否则跳过继续尝试填充下一个位置
        if(board[row][col] == '.') {
    
    
            // 尝试填充1~9
            for(int num = 1; num <= 9; num++){
    
    
                boolean canUsed = !(rowUsed[row][num] || colUsed[col][num] || boxUsed[row/3][col/3][num]);
                if(canUsed){
    
    
                    rowUsed[row][num] = true;
                    colUsed[col][num] = true;
                    boxUsed[row/3][col/3][num] = true;
                    
                    board[row][col] = (char)('0' + num);
                    if(recusiveSolveSudoku(board, rowUsed, colUsed, boxUsed, row, col + 1)){
    
    
                        return true;
                    }
                    board[row][col] = '.';
                    
                    rowUsed[row][num] = false;
                    colUsed[col][num] = false;
                    boxUsed[row/3][col/3][num] = false;
                }
            }
        } else {
    
    
            return recusiveSolveSudoku(board, rowUsed, colUsed, boxUsed, row, col + 1);
        }
        return false;
    }
}

おすすめ

転載: blog.csdn.net/qq_42148307/article/details/120313463
おすすめ