leetcode第36题--Sudoku Solver
题目:
Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'
.
You may assume that there will be only one unique solution.
A sudoku puzzle...
...and its solution numbers marked in red.
这题相对上题值判断是否合法来说就是更难了。
网上有很多解法,有的复杂有的简洁。我把我理解的记录如下:
思路应该要很明确。利用回溯法。这里是用递归的回溯。我特意复习了下回溯法。就是利用dfs。一直遍历找到符合的解,这个过程有相应的剪枝,剪就通过下面的isValid来进行。需要注意的地方已经给了注释。诉说千字不如代码一行。
class Solution { private: bool isValid(vector<vector<char> > &board, int x, int y) { for (int i = 0; i < 9; ++i) // 判断行是否有重复字符 { if (board[i][y] == board[x][y] && i != x) return false; } for (int i = 0; i < 9; ++i) // 列 { if (board[x][i] == board[x][y] && i != y) return false; } for (int i = 3*(x/3); i < 3*(x/3)+3; ++i) // 子九宫是否有重复 for (int j = 3*(y/3); j < 3*(y/3)+3; ++j) // 纸上画一个框就能推出其中每个格子的起点和终点与xy的关系 { if (board[i][j] == board[x][y] && i != x && j != y) return false; } return true; // 都没有就返回合法 } public: bool solveSudoku(vector<vector<char> > &board) { // backtracking for (int i = 0; i < 9; ++i) for (int j = 0; j < 9; ++j) { if ('.' == board[i][j]) { for (int k = 1; k <= 9; ++k) // 注意了是1到9,别误以为0到8 { board[i][j] = '0'+ k; // = 别写成 == 了,调式了十分钟发现我写成==,泪崩 if (isValid(board, i, j) && solveSudoku(board)) // 如果加入的数合法,并且,加入后的有解,那就true return true; board[i][j] = '.'; // if没有返回那就是k取值不合法,所以要重新把元素恢复为'.' } return false; } } return true; // 最后一次所有的都填了数字了,解成功了就返回正确 } };
分类:
LeetCode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· Tinyfox 简易教程-1:Hello World!