leetcode 37 Sudoku Solver java
求数独,只要求做出一个答案就可以。
刚开始对题意理解错误,以为答案是唯一的, 所以做了很久并没有做出来,发现答案不唯一之后,使用回溯。(还是借鉴了一下别人)
public class Solution {
public void solveSudoku(char[][] board) {
HashSet[] hashset = new HashSet[27];
for (int i = 0; i < 27; i++)
hashset[i] = new HashSet<Character>();
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char Char = board[i][j];
if (Char != '.') {
hashset[i].add(Char);
hashset[9 + j].add(Char);
hashset[18 + (i / 3) * 3 + j / 3].add(Char);
}
}
}
int flag = 0;
char[][][] num = null ;
while ( flag == 0) {
flag = 1;
num = new char[9][9][9];
for (int i = 0; i < 9; i++) {// i代表第i个hashset
for (int j = 1; j < 10; j++) {// j代表1-9
char ch = (char) (j + '0');
int[] test = new int[2];
if (!hashset[i].contains(ch)) {
test[0] = 0;
for (int k = 0; k < 9; k++) {
char Ch = board[i][k];
if (Ch == '.') {
if (!hashset[9 + k].contains(ch) && !hashset[18 + (i / 3) * 3 + k / 3].contains(ch)) {
addNum(num, i, k, ch);
test[0]++;
test[1] = k;
}
}
}
}
if (test[0] == 1) {
board[i][test[1]] = ch;
hashset[i].add(ch);
flag = 0;
hashset[9 + test[1]].add(ch);
hashset[18 + (i / 3) * 3 + test[1] / 3].add(ch);
}
}
}
for (int qq = 0; qq < 9 && flag == 1; qq++) {
for (int j = 0; j < 9 && flag == 1; j++) {
if (getlen(num[qq][j]) == 1) {
char ch = num[qq][j][0];
board[qq][j] = ch;
flag = 0;
hashset[qq].add(ch);
hashset[9 + j].add(ch);
hashset[18 + (qq / 3) * 3 + j / 3].add(ch);
}
}
}
}
solve(board);
}
public boolean solve(char[][] board){
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
if(board[i][j] == '.'){
for(char c = '1'; c <= '9'; c++){//trial. Try 1 through 9 for each cell
if(isValid(board, i, j, c)){
board[i][j] = c; //Put c for this cell
if(solve(board))
return true; //If it's the solution return true
else
board[i][j] = '.'; //Otherwise go back
}
}
return false;
}
}
}
return true;
}
public boolean isValid(char[][] board, int i, int j, char c){
for(int row = 0; row < 9; row++)
if(board[row][j] == c)
return false;
for(int col = 0; col < 9; col++)
if(board[i][col] == c)
return false;
for(int row = (i / 3) * 3; row < (i / 3) * 3 + 3; row++)
for(int col = (j / 3) * 3; col < (j / 3) * 3 + 3; col++)
if(board[row][col] == c)
return false;
return true;
}
public static int getlen(char[] num) {
int len = 0;
for (int i = 0; i < 9; i++) {
if (num[i] < '1' || num[i] > '9') {
return len;
} else
len++;
}
return len;
}
public static void addNum(char[][][] num, int num1, int num2, char ch) {
for (int i = 0; i < 9; i++) {
if (num[num1][num2][i] < '0' || num[num1][num2][i] > '9') {
num[num1][num2][i] = ch;
break;
}
}
}
}
回溯法还是比较简单的,就是在实现的时候,如果想要提高运行的速度和空间,那么需要费一些心思来考虑。
附上借鉴的代码
public class Solution {
public void solveSudoku(char[][] board) {
if(board == null || board.length == 0)
return;
solve(board);
}
public boolean solve(char[][] board){
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
if(board[i][j] == '.'){
for(char c = '1'; c <= '9'; c++){//trial. Try 1 through 9 for each cell
if(isValid(board, i, j, c)){
board[i][j] = c; //Put c for this cell
if(solve(board))
return true; //If it's the solution return true
else
board[i][j] = '.'; //Otherwise go back
}
}
return false;
}
}
}
return true;
}
public boolean isValid(char[][] board, int i, int j, char c){
//Check colum
for(int row = 0; row < 9; row++)
if(board[row][j] == c)
return false;
//Check row
for(int col = 0; col < 9; col++)
if(board[i][col] == c)
return false;
//Check 3 x 3 block
for(int row = (i / 3) * 3; row < (i / 3) * 3 + 3; row++)
for(int col = (j / 3) * 3; col < (j / 3) * 3 + 3; col++)
if(board[row][col] == c)
return false;
return true;
}
}
leetcode 37 Sudoku Solver java的更多相关文章
- leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题
三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...
- Java [leetcode 37]Sudoku Solver
题目描述: Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated ...
- [LeetCode] 37. Sudoku Solver 求解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy ...
- [leetcode]37. Sudoku Solver 解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy ...
- LeetCode 37 Sudoku Solver(求解数独)
题目链接: https://leetcode.com/problems/sudoku-solver/?tab=Description Problem : 解决数独问题,给出一个二维数组,将这个数独 ...
- [leetcode 37]sudoku solver
1 题目: 根据给出的数独,全部填出来 2 思路: 为了做出来,我自己人工做了一遍题目给的数独.思路是看要填的数字横.竖.子是否已经有1-9的数字,有就剔除一个,最后剩下一个的话,就填上.一遍一遍的循 ...
- [Leetcode][Python]37: Sudoku Solver
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 37: Sudoku Solverhttps://oj.leetcode.co ...
- 【LeetCode】37. Sudoku Solver
Sudoku Solver Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are i ...
- 【leetcode】Sudoku Solver
Sudoku Solver Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are i ...
随机推荐
- 倍增 LCA
以NOIP2013提高组day1 最后一道题为例来学的倍增和lca.其实这套题早就做过了,倍增和lca也学过,只不过当时没有理解清楚,所以今天再次学了一遍,虽然没有时间编程序了,但是先把思路和做法在这 ...
- touch ImageView
package com.example.touchdemo; import android.os.Bundle;import android.app.Activity;import android.u ...
- git 克隆项目 与 分支简单操作
git clone http://abcde.com/myproject/abc.git 克隆远程项目到本地githome文件夹git branch -a 查看所有分支 包括远程和本地 *号开头表示当 ...
- 学习MVC的一些随笔简单记录
1 视图本身没有它所要显示的数据,视图的数据源始终是控制器 3 游戏的进行是模型的一部分,不是控制器的一部分 4 模型关于游戏是什么,在模型中封装游戏进行的逻辑,模型对用户界面一无所知,里面没有任何同 ...
- python抓取性感尤物美女图
由于是只用标准库,装了python3运行本代码就能下载到多多的美女图... 写出代码前面部分的时候,我意识到自己的函数设计错了,强忍继续把代码写完. 测试发现速度一般,200K左右的下载速度,也没有很 ...
- 使用goldengate交付指定时间前的数据
在数据同步过程中,客户担心在源端误操作,比如truncate, drop, delete all等,在目标端也会立即同步,而无法挽救损失:因此,客户希望是目标端的数据比源端要慢一个时间点. 解决方案: ...
- Form表单的操作
form对象 <form name=“form1” action=“login.php” method=“post”></form> form对象的属性 name:表单名称 m ...
- Interview----判断整数序列是否是二叉搜索树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: ...
- 【Tsinghua OJ】灯塔(LightHouse)问题
描述 海上有许多灯塔,为过路船只照明.从平面上看,海域范围是[1, 10^8] × [1, 10^8] . (图一) 如图一所示,每个灯塔都配有一盏探照灯,照亮其东北.西南两个对顶的直角区域.探照灯的 ...
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...