虫虫首页| 资源下载| 资源专辑| 精品软件
登录| 注册

您现在的位置是:首页 > 技术阅读 >  每日一题:解数独问题

每日一题:解数独问题

时间:2024-02-14

编写一个程序,通过已填充的空格来解决数独问题。

一个数独的解法需遵循如下规则:

数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 '.' 表示。

一个数独。

答案被标成红色。

Note:

  • 给定的数独序列只包含数字 1-9 和字符 '.' 。

  • 你可以假设给定的数独只有唯一解。

  • 给定数独永远是 9x9 形式的。

分析

解数独问题是回溯思想中比较经典的问题啦,9*9一共81个格子,每个格子都放入1-9数字尝试是否满足条件,见代码

代码

class Solution {
public:
   void solveSudoku(vector<vector<char>>& board) {
       Backtrace(board, 0, 0);
   }

   bool Backtrace(vector<vector<char>>& board, int row, int col) {
       if (col == 9) {
           row += 1;
           col = 0;
           if (row == 9) {
               return true;
           }
       }
       if (board[row][col] == '.') {
           for (char i = '1'; i <= '9'; ++i) {
               if (IsValid(board, row, col, i)) {
                   board[row][col] = i;
                   if (Backtrace(board, row, col+1)) return true;
                   board[row][col] = '.';
               }
           }
       } else {
           return Backtrace(board, row, col+1);
       }
       return false;
   }

   bool IsValid(vector<vector<char>>& board, int row, int col, char value) {
       for (int i = 0; i < 9; ++i) {
           if (board[i][col] == value) return false;
           if (board[row][i] == value) return false;
       }
       int imin = row / 3 * 3;
       int jmin = col / 3 * 3;
       int imax = (row + 3) / 3 * 3;
       int jmax = (col + 3) / 3 * 3;
       for (int i = imin; i < imax; ++i) {
           for (int j = jmin; j < jmax; ++j) {
               if (board[i][j] == value) return false;
           }
       }
       return true;
   }
};


更多精彩推荐,请关注我们


代码精进之路


  代码精进之路,我们一起成长!




C++数组长度可以为变量吗?

C++中glog源码剖析以及如何设计一个高效log模块

想看懂stl代码,先搞定type_traits是关键

C++线程池的实现

源码分析shared_ptr实现