• leecode---37---多维数组,dfs---解决一个数独问题


    遍历每行
    遍历每列
    找到一个位置,如果是个空的,就遍历1到九。
    写一个函数,判断当前位置如果放了个数字后是否是合理的,所以这个函数是放在if判断里面的,就是如果这个数放这里可以,那么接下去处理。判断方式就是遍历行后遍历列,同时遍历小方框九个参数,如果有相同的返回false。
    如果这个位置放了某个数字可以,那么接下去dfs。

     
    题意
    给一个二维数组,没填写的地方是‘。’,然后解决这个数独问题。
     
    分析
    dfs函数
     
    代码
    class Solution {
        public void solveSudoku(char[][] board) {
            if (board == null || board.length != 9 || board[0].length != 9) return ;
            dfs(board);
        }
        
        //1.带有回溯的,因为不是求组合数量,而是求正确与否。
        //2.选择条件是把九个数字放进去试试,不行回滚回来。
        public boolean dfs(char[][] board) {
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    
                    //两层循环处理每个节点,如果这个节点是个要填数的地方就使用数字去填写他。
                    if (board[i][j] == '.') {
                        //试试九个数字,每个数字都试一次
                        for (char num='1';num <= '9';num++) {
                             if (isValid(board,i,j,num)) {//如果当前这个点放进去有效果
                                 board[i][j] = num;
                                 if(dfs(board))return true;
                                 else board[i][j] = '.';//否则就回退将那个位置设置成'.'
                             }   
                        }
                        //最后如果九个数字都试过去了还是错误的那么返回false,说明本身这个数组有重复的错误。
                        return false;
                    }
                    
                }
            }
            
            //找了每一个点都看过了说明已经填好了
            return true;
        }
        
        //判断在i,j坐标点处放上一个c是否能够成立。成立的话就继续
        public boolean isValid(char[][] board,int i,int j,char c) {
            //行判断
            for (int col=0;col < 9;col++) {
                if (board[i][col] == c) return false;
            }
            for (int row = 0; row < 9;row++) {
                if (board[row][j] == c) return false;
            }
            for (int row=i/3*3;row<i/3*3+3;row++){
                for (int col = j/3*3;col < j/3*3+3;col++) {
                    if (board[row][col]==c)return false;
                }
            }
            return true;
        }
        
    }
  • 相关阅读:
    Java 注解(Annotation)
    定时任务相关介绍
    Linux基础命令yum
    Linux基础命令rpm
    Linux基础命令date(如何设置时间? 如何同步时间?)
    Linux基础命令tar(如何压缩文件?如何解压文件?如何不解压查看内容?)
    Linux基础命令gzip
    Linux基础命令zip unzip (压缩 解压)
    Linux中压缩的概念(什么是压缩包?)
    Linux基础命令练习答案7.27
  • 原文地址:https://www.cnblogs.com/buptyuhanwen/p/8985487.html
Copyright © 2020-2023  润新知