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;
        }
        
    }
  • 相关阅读:
    延时函数出错,volatile一例
    【转】STM32中的抢占优先级、响应优先级概念
    【转载】串口中怎样接收一个完整数据包的解析
    ARM-ContexM3/4组优先级和子优先级抢占规则
    【转载】Keil中的USE MicroLib说明
    线程让出实验【RT-Thread学习笔记 4】
    线程优先级抢占实验【RT-Thread学习笔记 3】
    RT-Thread的线程(任务)处理【RT-Thread学习笔记 2】
    熟悉RT-Thread的软硬件环境【RT-Thread学习笔记 1】
    RT-Thread下的串口驱动程序分析【转载】
  • 原文地址:https://www.cnblogs.com/buptyuhanwen/p/8985487.html
Copyright © 2011-2022 走看看