[LeetCode]SudokuSolver解决数独问题
来源:互联网 发布:hough算法检测直线 编辑:程序博客网 时间:2024/06/10 15:41
一、 问题描述:
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.
二、解决思路:
看起来数独是个比较麻烦的问题,实际上在用程序模拟的时候是个比较简单的过程,类似于八皇后问题,可采用回溯的思想解决。
这里主要创建了三个boolean的数组分别来记录棋盘board的行、列、块的状态,并用一个linkedlist记录board中为空的格子的位置,提高扫描效率。
注意每次回溯之后恢复这些数组和容器的状态即可。
import java.util.*;import java.io.*;public class SudokuSolver {public void solveSudoku(char[][] board) { boolean[][] rowAppear = new boolean[9][9]; boolean[][] colAppear = new boolean[9][9]; boolean[][] blockAppear = new boolean[9][9]; List<Integer[]> list = new LinkedList<>(); for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {char tmp = board[i][j];if (tmp != '.') {rowAppear[i][tmp-'1']=true;colAppear[j][tmp-'1']=true;blockAppear[i/3*3+j/3][tmp-'1']=true;}else {list.add(new Integer[]{i,j});}}} helper(board, rowAppear, colAppear, blockAppear, list); }public boolean helper(char[][] board, boolean[][] rowAppear, boolean[][] colAppear, boolean[][] blockAppear, List<Integer[]> list) {if (list.isEmpty()) {return true;}Integer[] tmpPos = list.get(0);int x=tmpPos[0], y=tmpPos[1];list.remove(0);for (int i = 0; i < 9; i++) {if (!rowAppear[x][i] && !colAppear[y][i] && !blockAppear[x/3*3+y/3][i]) {board[x][y] = (char)('1'+i);rowAppear[x][i] = true;colAppear[y][i] = true;blockAppear[x/3*3+y/3][i] = true;if (helper(board, rowAppear, colAppear, blockAppear, list)) return true;board[x][y] = '.';rowAppear[x][i] = false;colAppear[y][i] = false;blockAppear[x/3*3+y/3][i] = false;}}list.add(0, tmpPos);return false;}public static void main(String[] args) {SudokuSolver sudokuSolver = new SudokuSolver();char[][] board = new char[9][9];Scanner scanner = new Scanner(System.in);for (int i = 0; i < 9; i++) {board[i] = scanner.next().toCharArray();}sudokuSolver.solveSudoku(board);for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {System.out.print(board[i][j]+" ");}System.out.print("\n");}}}
0 0
- [LeetCode]SudokuSolver解决数独问题
- leetcode--37--数独问题
- [LeetCode] [数独问题] Sudoku Solver
- [LeetCode] [数独问题] Valid Sudoku
- DLX之数独问题的解决
- gac算法解决数独问题
- 数独问题的c++解决
- Leetcode数独
- 【LeetCode】数独系列
- leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题
- C语言 递归(回溯) 解决数独问题
- 数独问题思考
- 数独问题
- cs101,数独问题
- 数独问题
- 4.9 数独问题
- 数独问题
- hdu - 数独问题
- Python 环境变量
- 利用htaccess将全站无效url转到首页
- 如何防止 CC攻击
- 窗口的生命周期分析
- 《OpenGL ES 2.0 Programming Guide》第12章“最简单的FBO Depth Texture”示例代码【C语言版】
- [LeetCode]SudokuSolver解决数独问题
- My97DatePicker日期插件使用说明
- 百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题
- codeforces 682C Alyona and the Tree(DFS)
- HDU 3791 比较两棵二叉搜索树是否相同(建树,比较)
- zynq学习02 新建一个Helloworld工程
- Transform.TransformDirection
- 正则表达式(RegExp)的方法和字符串的模式匹配方法
- Linux的文件类型和权限