• 37. Sudoku Solver


           最近比较烦,被领导拉去谈话说年后是不是就要跳槽走,凭着我这直男的性子,脱口而出“是的,除非涨薪比较明显”。说完就后悔了,今年吧在这家公司吧也没啥成绩就急着走人,以后的日子贼尴尬。我吧一直对算法比较感兴趣,可是脑子就是转不快,就有时候后端说的东西都有点不明白,一直被同层级的后端牵着走。说实话自己是个失败的前端,沟通能力又极为欠缺,实在找不到什么优点,除了对vue和原生js相对更懂一些,其他的都不太懂。虽然懂得东西少的可怜,但是我知道只要把算法能力提升一个高度,一切都会不一样的,坚持刷leetcode。

          数独:1.9X9棋盘格

        2.每一行填入1-9不重复,每一列一样

                  3.9X9的棋盘格又可细分为9个3X3的小棋盘格,每个3X3的小棋盘格填入1-9,并且小棋盘格里的数字也不能重复

        说来惭愧,这道题和之前做过的n皇后问题属于一个问题,动态规划,只不过现在又忘了怎么做了,正好今天复习一下

        动态规划:按我的理解动态规划就是递归,只不过每一次递归都把所有的可能结果保存起来,当递归完成也就取到了所有可能的结果,可以用来解决最优解的问题,如背包问题。

        解题思路:1.遍历:递归遍历这个二维数组(棋盘格)

          2.带入可选值:如果当前值为数值则跳过,若为"."则逐步带入1-9并判断其合法性

          3.是否符合要求:检测带入的值是否符合要求

    思路简单,但要原原本本写出代码通过测试还是需要一定功底的。代码如下:

    var solveSudoku = function(board) {
        if(board.length===0 || board.length!==9 || board[0].length!==9) return ;
        dfs(board,0,0);
    };
    // 判断是否符合要求
    /**
    *1.每一行值各不相同
    *2.每一列值各不相同
    *3.每个3X3的小棋盘里的值各不相同
    */
    var isValid=function(board,i,j){
        for(let col=0;col<9;col++){
            if(col!==j && board[i][j]===board[i][col]) return false;
        }
        for(let row=0;row<9;row++){
            if(row!==i && board[i][j]===board[row][j]) return false;
        }
        for(let row=parseInt(i/3)*3;row<parseInt(i/3)*3+3;row++){
            for(let col=parseInt(j/3)*3;col<parseInt(j/3)*3+3;col++){
                if((row!==i || col!==j)&&board[i][j]===board[row][col]) return false;
            }
        }
        return true;
    };
    /**
    *递归遍历,边界判断,逐个数字带入值为'.'的方格,判断其是否符合要求
    */
    var  dfs=function(board,i,j){
        if(i===9) return true;
        if(j>=9) return dfs(board,i+1,0);
        if(board[i][j]==='.'){
            for(let k=1;k<=9;k++){
                board[i][j]=k+'';
                if(isValid(board,i,j)){
                    if(dfs(board,i,j+1)) return true;
                }
                board[i][j]='.';
            }
        }else{
            return dfs(board,i,j+1);
        }
        return false;
    };
  • 相关阅读:
    python字典推导式
    什么是Python 自省
    类变量和实例变量
    Python 使用正则表达式匹配URL网址
    python is 和 “==”的区别
    阮一峰老师的bash教程,建议阅读
    python里的闭包
    什么是生成器
    python访问限制
    pytorch使用Tips
  • 原文地址:https://www.cnblogs.com/xingguozhiming/p/10296498.html
Copyright © 2020-2023  润新知