37. 解数独 Sudoku Solver
Write a program to solve a Sudoku puzzle by filling the empty cells.
A sudoku solution must satisfy all of the following rules:
- Each of the digits
1-9
must occur exactly once in each row. - Each of the digits
1-9
must occur exactly once in each column. - Each of the digits
1-9
must occur exactly once in each of the 93x3
sub-boxes of the grid.
The '.'
character indicates empty cells.
方法:
递归加回溯法
public class SudokuSolver { private boolean[][] row = new boolean[9][9]; private boolean[][] col = new boolean[9][9]; private boolean[][][] block = new boolean[3][3][9]; private boolean valid = false; private List<int[]> spaces = new ArrayList<>(); public void solveSudoku(char [][] board){ for(int i = 0; i < 9; i++){ for(int j = 0; j < 9; j++){ if(board[i][j] == '.'){ spaces.add(new int[]{i, j}); }else{ int digit = board[i][j] - '0' - 1; row[i][digit] = col[j][digit] = block[i / 3][j / 3][digit] = true; } } } dfs(board , 0); } public void dfs(char[][] board, int pos){ if(pos == spaces.size()){ valid = true; return; } int [] space = spaces.get(pos); int i = space[0], j = space[1]; for (int digit = 0; digit < 9 && !valid; ++digit){ if(!row[i][digit] && !col[j][digit] && !block[i / 3][j / 3][digit]){ row[i][digit] = col[j][digit] = block[i / 3][j / 3][digit] = true; board[i][j] = (char)(digit + '0' + 1); dfs(board, pos + 1); row[i][digit] = col[j][digit] = block[i / 3][j / 3][digit] = false; } } } }
参考链接:
https://leetcode.com/problems/sudoku-solver/
https://leetcode-cn.com/problems/sudoku-solver/
分类:
leetcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具