DFS&BFS - 37. Sudoku Solver
时间:2022-07-25
本文章向大家介绍DFS&BFS - 37. Sudoku Solver,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 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 the digits
1-9
must occur exactly once in each of the 93x3
sub-boxes of the grid.
Empty cells are indicated by the character '.'
.
A sudoku puzzle...
...and its solution numbers marked in red.
Note:
- The given board contain only digits
1-9
and the character'.'
. - You may assume that the given Sudoku puzzle will have a single unique solution.
- The given board size is always
9x9
.
思路:
题目是让求解数组,就是每一行每一列每一个3*3的小方格不允许重复,做法和n皇后问题一样,就是使用dfs来枚举每一种填法,然后回溯。
代码:
go:
var col, row, box [][]bool
func initGrid(board [][]byte) {
col = make([][]bool, 10)
row = make([][]bool, 10)
box = make([][]bool, 10)
for i := range col {
col[i] = make([]bool, 10)
row[i] = make([]bool, 10)
box[i] = make([]bool, 10)
}
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
c := board[i][j]
if c != '.' {
col[j][c - '0'] = true
row[i][c - '0'] = true
box[j/3 + i/3*3][c - '0'] = true
}
}
}
}
func dfs(board [][]byte, x int, y int) bool {
if y == 9 {
return true
}
nextX := (x + 1 ) % 9
nextY := y
if nextX == 0 {
nextY = y + 1
}
if board[y][x] != '.' {
return dfs(board, nextX, nextY)
}
// 枚举
for num := byte(1); num <= 9; num++ {
if !col[x][num] && !row[y][num] && !box[x/3 + y/3*3][num] {
col[x][num] = true
row[y][num] = true
box[x/3 + y/3*3][num] = true
board[y][x] = num + '0'
if dfs(board, nextX, nextY) {
return true
}
col[x][num] = false
row[y][num] = false
box[x/3 + y/3*3][num] = false
board[y][x] = '.'
}
}
return false
}
func solveSudoku(board [][]byte) {
initGrid(board)
dfs(board, 0, 0)
}
- DataSet的灵活,实体类的方便,DTO的效率:SOD框架的数据容器,打造最适合DDD的ORM框架
- Java 内部类种类及使用解析
- JSON与XML的区别比较
- 无需开启宏即可渗透:在Office文档中利用DDE执行命令
- SQLiv:一款批量SQL注入漏洞扫描工具
- 【Python环境】监督学习之KNN算法
- 【数据科学】什么是数据科学家与数据科学
- Android基础总结(12)——XML和JSON解析
- 【Python环境】scikit-learn的线性回归模型
- Android基础总结(8)——服务
- 你需要每天写代码吗?
- Java基础——多线程
- No.010 Regular Expression Matching
- JavaScript依赖注入的实现思路
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux搭建自己Nexus私服的实现方法
- centos7系统nginx服务器下phalcon环境搭建方法详解
- Logrotate实现Catalina.out日志每俩小时切割示例
- Linux常见问题解决方案汇总
- Linux中文件/文件夹无法删除的解决方案
- GNU Parallel的具体使用
- crontab定时任务不执行的原因分析与解决方法
- 在Linux中安装ASPNET.Core3.0运行时的示例代码
- linux Bash脚本判别使用者的身份方法示例
- 配置Linux使用LDAP用户认证的方法
- linux Dig命令使用大全
- Ubuntu虚拟机下使用cutecom进行串口通信的方法
- 虚拟机Linux系统忘记密码修改root或其他用户密码的方法
- 在 RHEL8 /CentOS8 上建立多节点 Elastic stack 集群的方法
- linux 搭建svn服务器的方法步骤