• LeetCode 37 Sudoku Solver(求解数独)


     
    Problem : 解决数独问题,给出一个二维数组,将这个数独进行求解。
     
    思路:
    1. 嵌套循环,三层循环体,每一行,每一列,填入从1到9的数字。判断填入之后是否合理
    2. 判断数独是否合理的函数
     
    参考代码: 
     
    package leetcode_50;
    
    /***
     * 
     * @author pengfei_zheng
     * 求解数独问题
     */
    public class Solution37 {
        public static void solveSudoku(char[][] board) {
            if(board==null ||board.length ==0)
                    return;
            else
                    solve(board);
        }
    
        private static boolean solve(char[][] board) {
            for(int i = 0 ; i < 9;i++){
                for(int j = 0 ; j < 9;j++){
                    if(board[i][j]=='.'){
                        for(char c = '1'; c<='9';c++){
                            if(isValid(board,i,j,c)){
                                board[i][j]=c;
                                if(solve(board))
                                    return true;
                                else
                                    board[i][j]='.';
                            }
                        }
                        return false;
                    }
                }
            }
            return true;
        }
    
        private static boolean isValid(char[][] board, int row, int column, char c) {
            for(int i = 0 ; i < 9; i ++){
                if(board[row][i]==c) return false;
                if(board[i][column]==c) return false;
                if(board[3 * (row / 3) + i / 3][ 3 * (column / 3) + i % 3] != '.' && 
                        board[3 * (row / 3) + i / 3][3 * (column / 3) + i % 3] == c) return false; //check 3*3 block
            }
            return true;
        }
        public static void main(String[]args){
            long start = System.currentTimeMillis();
            char[][] board={{'8','.','.','.','.','.','.','.','.'},
                            {'.','.','3','6','.','.','.','.','.'},
                            {'.','7','.','.','9','.','2','.','.'},
                            {'.','5','.','.','.','7','.','.','.'},
                            {'.','.','.','.','4','.','7','.','.'},
                            {'.','.','.','1','.','5','.','3','.'},
                            {'.','.','1','.','.','.','.','6','8'},
                            {'.','.','8','5','.','.','.','1','.'},
                            {'.','9','.','.','.','.','4','.','.'}
                        };
            solveSudoku(board);
            long end = System.currentTimeMillis();
            for(int i = 0 ; i < 9 ; i ++){
                for(int j = 0 ; j < 9 ;j ++){
                    System.out.print(board[i][j]+" ");
                }
                System.out.println();
            }
            System.out.println("耗时: "+ (double)(end-start)/1000+" s");
        }
    }
  • 相关阅读:
    MySQL调优篇 | 逻辑架构解读(1)
    SQLPlus 在连接时通常有四种方式
    Oracle解决索引碎片功能
    windows2003 ftp 无法下载 解决
    bat记录
    ACCESS字符串操作函数
    缓存和RAID如何提高磁盘IO性能
    TortoiseSVN 命令 (命令行执行工具)
    在RHEL5下实现磁盘分区和磁盘配额
    PS 命令详解
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/6534906.html
Copyright © 2020-2023  润新知