zoukankan      html  css  js  c++  java
  • 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;
        }
        
    }
  • 相关阅读:
    codeforces 732D
    我的ubuntu配置
    周末实在无聊,自己写了一遍被人写烂了的“贪吃蛇”,欢迎各位新手低手高手老手前来吐槽哈哈
    两种方式实现点击列表弹出列表索引
    浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系
    写了个超级简单的“进度条”的demo,供新手参考,高手吐槽!
    javascript 使用 NodeList主意的问题
    js中的“||”和“&&”
    javascript call函数实现继承时遇到的问题
    javascript 解决innerText浏览器兼容
  • 原文地址:https://www.cnblogs.com/buptyuhanwen/p/8985487.html
Copyright © 2011-2022 走看看