图-搜索-DFS-37. 解数独
2024-08-26 20:05:47
2020-03-24 22:23:32
问题描述:
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。
一个数独。
答案被标成红色。
提示:
给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
问题求解:
经典的DFS问题,可以使用回溯法解决。
int[][] rows = new int[9][9];
int[][] cols = new int[9][9];
int[][] boxes = new int[9][9]; public void solveSudoku(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char c = board[i][j];
if (c == '.') continue;
int k = c - '0';
rows[i][k - 1] = 1;
cols[j][k - 1] = 1;
boxes[i / 3 * 3 + j / 3][k - 1] = 1;
}
}
helper(board, 0, 0);
} private boolean helper(char[][] board, int row, int col) {
if (row >= 9) return true;
int nr = row;
int nc = col + 1;
if (col == 8) {
nr = nr + 1;
nc = 0;
}
if (board[row][col] != '.') return helper(board, nr, nc);
for (int i = 1; i <= 9; i++) {
if (rows[row][i - 1] == 1 || cols[col][i - 1] == 1 || boxes[row / 3 * 3 + col / 3][i - 1] == 1) continue;
rows[row][i - 1] = 1;
cols[col][i - 1] = 1;
boxes[row / 3 * 3 + col / 3][i - 1] = 1;
board[row][col] = (char)(i + '0');
if (helper(board, nr, nc)) return true;
board[row][col] = '.';
rows[row][i - 1] = 0;
cols[col][i - 1] = 0;
boxes[row / 3 * 3 + col / 3][i - 1] = 0;
}
return false;
}
最新文章
- Android学习——windows下搭建NDK_r9环境
- hdu 1181(DFS)变 形 课
- cas+shiro实现不时时的去请求cas进行身份验证
- BZOJ 1012 题解
- transition&;transform,CSS中过度和变形的设置
- HTML 透明、阴影,圆角等知识点
- [转载]Jmeter那点事&#183;ForEach和If控制器
- 『Python』 ThreadPool 线程池模板
- C# 方法的可选参数、命名参数
- ACE的构建(VC++6.0环境)
- C#邮件收发
- Mesos初步尝试
- iOS开发基础-九宫格坐标(1)
- Nginx拦截指定国家的IP
- JAVA中验证邮箱是否有效
- linux init命令
- 【Linux 进程】孤儿进程、僵尸进程和守护进程
- gson转换对象为json字符串时对特殊字符编码的问题
- .NET后台访问其他站点代码整理
- 【转】获取Windows系统明文密码神器