• 预见
    2018-11-15
    sometimes naive 老师满怀爱意地笑了
    
     22
  • Lcanboom
    2019-05-26
    老师,可以给下添加了预处理后的代码吗
    
     1
  • 薛25
    2018-12-21
    老师不用python来写朴素程序是因为运行的太慢了leetcode上通不过吧。。。。

    作者回复: 不是,只是随机选的语言。我记得leetcode上不同需要的时限不一样。

    
     1
  • 堕落天使
    2018-11-29
    老师,我按照您讲的第二种方式给数独的DFS加速了(遍历一遍数独,先求出每个格子的可选值,然后再根据可选值的数量进行排序,最后再跟据排过序的列表递归遍历),虽然递归调用的次数大大减少了(从4209次减少到了103次)。但是总体的时间却增加了(从我电脑的0ms变成了4ms)。那么这个加速还有必要吗,它的意义又在哪里呢?
    
     1
  • Geek_949848
    2018-11-26
    老师,这道题代码那么多,建议以后都用python写会更简洁,更方便教学。表示对于您在java和python代码中切换有点晕了。
    
     1
  • 宋晓明
    2018-11-17
    老师 这节课跟皇后那节有点难以理解,即使看代码也理解不了 看着看着就绕进去了 是否暂时先不看?

    作者回复: 可以先多多练习递归和分治,然后回来再看和写数独和八皇后问题。

    
     1
  • lzh
    2020-01-03
    C++,预处理+位运算

    class Solution {
    public:
        void solveSudoku(vector<vector<char>>& board) {
            this->initCriteria(board);
            this->fill(board, 0, 0);
        }

    private:
        vector<int> rowCriteria, colCriteria, cellCriteria;
        int size = 9, cellSize = 3;
        bool finish = false;

        void initCriteria(vector<vector<char>>& board)
        {
            int cellNum;
            char numChar;

            this->rowCriteria = vector<int>(this->size, 0);
            this->colCriteria = vector<int>(this->size, 0);
            this->cellCriteria = vector<int>(this->size, 0);

            for (int x = 0; x < this->size; x++)
            {
                for (int y = 0; y < this->size; y++)
                {
                    if (board[x][y] != '.')
                    {
                        numChar = (int)board[x][y] - int('0');
                        this->criteriaAdd(x, y, 1 << numChar);
                    }
                }
            }
        }

        void fill(vector<vector<char>>& board, int x, int y)
        {
            int tmp, cellNum;

            while (x < this->size)
            {
                while (y < this->size)
                {
                    if (board[x][y] == '.')
                    {
                        for (int i = 1; i <= this->size; i++)
                        {
                            tmp = 1 << i;
                            cellNum = x / this->cellSize * this->cellSize + y / this->cellSize;
                            if ((this->rowCriteria[x] & tmp) == 0 &&
                                (this->colCriteria[y] & tmp) == 0 &&
                                (this->cellCriteria[cellNum] & tmp) == 0)
                            {
                                board[x][y] = char('0' + i);
                                this->criteriaAdd(x, y, tmp);
                                this->fill(board, x, y + 1);
                                if (this->finish)
                                {
                                    return;
                                }
                                else
                                {
                                    this->criteriaAdd(x, y, tmp, false);
                                }
                            }
                        }
                        board[x][y] = '.';
                        return;
                    }
                    y++;
                }
                y = 0;
                x++;
            }
            this->finish = true;
        }

        void criteriaAdd(int x, int y, int num, bool add = true)
        {
            int cellNum;

            this->rowCriteria[x] = add ? this->rowCriteria[x] + num : this->rowCriteria[x] - num;
            this->colCriteria[y] = add ? this->colCriteria[y] + num : this->colCriteria[y] - num;

            cellNum = x / this->cellSize * this->cellSize + y / this->cellSize;
            this->cellCriteria[cellNum] = add ? this->cellCriteria[cellNum] + num : this->cellCriteria[cellNum] - num;
        }
    };
    展开
    
    
  • Aliliin
    2019-11-19
    PHP 实现:

    public function solveSudoku(&$board)
      {
        if (!$board) return;
        $this->sudoku($board);
      }
      public function sudoku(&$board)
      {
        for ($i = 0; $i < count($board); $i++) {
          for ($j = 0; $j < count($board[0]); $j++) {
            if ($board[$i][$j] == ".") {
              for ($c = "1"; $c <= "9"; $c++) {
                if ($this->valid($board, $i, $j, $c)) {
                  $board[$i][$j] = (string)$c;
                  if ($this->sudoku($board)) {
                    return true;
                  }
                  $board[$i][$j] = ".";
                }
              }
              return false;
            }
          }
        }
        return true;
      }

      public function valid($board, $row, $col, $c)
      {

        for ($i = 0; $i < 9; $i++) {
          if ($board[$i][$col] != "." && $board[$i][$col] == $c) return false;
          if ($board[$row][$i] != "." && $board[$row][$i] == $c) return false;
          $x = 3 * floor($row / 3) + floor($i / 3);
          $y = 3 * floor($col / 3) + floor($i % 3);
          if ($board[$x][$y] != "." && $board[$x][$y] == $c) return false;
        }
        return true;
      }
    展开
    
    
  • 陈志恒
    2019-09-27
    深度遍历要注意遍历对象的确定,这里遍历的是“抽象层”(只有空位的地方)
    
    
  • 陈志恒
    2019-09-27
    搜索+剪枝
    
    
  • 陈志恒
    2019-09-27
    dfs bfs就是一种遍历的暴力解法,要在这个基础上进行优化
    
    
  • 大橙子
    2019-07-24
    too young too simple,sometimes naive
    
    
  • 大俊stan
    2019-07-21
    老师,您好。我看了您的数独有效解法,在思考一个问题,会不会存在这样一种情况接:一开始第一个格子是让填三个数字的,但最终结果是只有一个数字是正确的那么另外两个错误的数字是如何执行的呢?后来思考到当执行到一步出现错误时,递归会一层一层的返回,把之前填上错误数值一层一层的重新设置成‘.’就 突然间觉得递归真厉害。
    
    
  • 曾经瘦过
    2018-12-04
    native方法比较容易想(和N皇后问题一样的思路 就是valid 有点区别),没玩过数独游戏,所以对如何剪枝并不是太理解。同时还产生了一些疑问,我是从事android 开发的,现在这些搜索的算法感觉比较适合 后台使用,对于前端学习这些算法感觉似乎用处并不是特别大,希望老师能帮忙解惑。

    作者回复: 也需要的,mobile上的应用效率和速度尤其重要。所以一定要对自己代码的时间复杂度有深刻理解。

    
    
  • yann [扬] :曹同学
    2018-11-30
    public void solveSudoku(char[][] board){
    // public boolean isValidSudoku(char[][] board) {

    貌似和给定的申明不大一样,编译不过去,
    
    
我们在线,来聊聊吧