[leetcode 37]sudoku solver

1 题目:

根据给出的数独,全部填出来

2 思路:

为了做出来,我自己人工做了一遍题目给的数独。思路是看要填的数字横、竖、子是否已经有1-9的数字,有就剔除一个,最后剩下一个的话,就填上。一遍一遍的循环,直到填完为止。

后来发现,这个思路只能解决部分数独。还有部分数独是需要回溯的,比如,这个位置只能填3或5,那么就需要先填上3,看看能否继续填下去,不能的话,再回过来填5。

想了半天,想不出来,把别人的backtracking看懂了,写出来了。。

3 代码:

自己的:

    Hashtable<Integer, List<Character>> table;
    int row;
    int column;
    int totalNum;

    public void solveSudoku(char[][] board) {
        if (board.length == 0) {
            return;
        }

        row = board.length;
        column = board[0].length;
        totalNum = row * column;
        table = new Hashtable<Integer, List<Character>>(totalNum);
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                if (board[i][j] == ‘.‘) {
                    List<Character> validNum = new ArrayList<Character>();
                    Character[] nums = {‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘};
                    validNum.addAll(Arrays.asList(nums));
                    table.put(i*row+j, validNum);
                }else {

                }
            }
        }

        fillBoard(board);
    }

    private void fillBoard(char[][] board)
    {
        for (int i = 0; i < row; i++) {
            System.out.println();
            for (int j = 0; j < column; j++) {
                int index = i*column + j;
                if (table.containsKey(index)) {
                    // 判断剩余的数字
                    calRemaingNum(i,j,index,board);
                }

            }
        }
        System.out.println("++++++++++++++++++++++++++++++++++++++");
        if (isSuccess()) {
            return;
        }
        fillBoard(board);
    }

    private void calRemaingNum(int i, int j, int calIndex,char[][] board)
    {
        //row
        for(int k=0; k< column; k++){
            if (board[i][k] != ‘.‘) {
                table.get(calIndex).remove((Character)board[i][k]);
            }
        }

        //column
        for (int k = 0; k < row; k++) {
            if (board[k][j] != ‘.‘) {
                table.get(calIndex).remove((Character)board[k][j]);
            }
        }

        //square
        int m = i / 3;
        int n = j / 3;
        for (int k = 0; k < 3; k++) {
            for (int k2 = 0; k2 < 3; k2++) {
                if (board[m*3+k][n*3+k2] != ‘.‘) {
                    table.get(calIndex).remove((Character)board[m*3+k][n*3+k2]);
                }
            }
        }
        System.out.println("i=" + i + " , j = " + j +  ",index = " + calIndex + "  ++ " + table.get(calIndex));
        if (table.get(calIndex).size() == 1) {
            board[i][j] = table.get(calIndex).get(0);
            table.remove(calIndex);
        }
    }

    private boolean isSuccess(){
        return table.size() == 0;
    }

别人的

     public void solveSudoku(char[][] board) {
         if (board==null || board.length == 0) {
             return;
        }

         fillboard(board);
     }

     private boolean fillboard(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 ch = ‘1‘; ch <= ‘9‘; ch++){
                        if (isValid(i, j, ch, board)) {
                            System.out.println("ok, i = " + i + ", j = " + j + " ,  value = " + ch);
                            board[i][j] = ch;

                            if (fillboard(board)) {
                                return true;
                            }else {
                                board[i][j] = ‘.‘;
                            }
                        }
                    }
                    return false;
                }
            }
        }

         return true;
     }

     private boolean isValid(int row, int column, char value, char[][] board){
         // row
         for (int i = 0; i < board.length; i++) {
            if (board[row][i] == value) {
                return false;
            }
        }

         // column
         for (int i = 0; i < board[0].length; i++) {
            if (board[i][column] == value) {
                return false;
            }
        }

         // square
            int m = row / 3;
            int n = column / 3;
            for (int k = 0; k < 3; k++) {
                for (int k2 = 0; k2 < 3; k2++) {
                    if (board[m*3+k][n*3+k2] == value) {
                        return false;
                    }
                }
            }
         return true;
     }
时间: 2024-11-10 01:33:18

[leetcode 37]sudoku solver的相关文章

[LeetCode] 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.

Java [leetcode 37]Sudoku Solver

题目描述: 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. 解题思路:

LeetCode 37 Sudoku Solver(求解数独)

题目链接: https://leetcode.com/problems/sudoku-solver/?tab=Description Problem : 解决数独问题,给出一个二维数组,将这个数独进行求解. 思路: 嵌套循环,三层循环体,每一行,每一列,填入从1到9的数字.判断填入之后是否合理 判断数独是否合理的函数 参考代码: package leetcode_50; /*** * * @author pengfei_zheng * 求解数独问题 */ public class Solutio

LeetCode 37 Sudoku Solver (C,C++,Java,Python)

Problem: 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. So

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>

【leetcode】 Sudoku Solver

问题: 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. 说明: 数独有

37. Sudoku Solver(js)

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 on

[Leetcode][Python]37: Sudoku Solver

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 37: Sudoku Solverhttps://oj.leetcode.com/problems/sudoku-solver/ Write a program to solve a Sudoku puzzle by filling the empty cells.Empty cells are indicated by the character '.'.You may assu

[LeetCode][JavaScript]Sudoku Solver

Sudoku Solver 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 re