zoukankan      html  css  js  c++  java
  • Sudoku Solver, 求数独

    问题描述:填充数独表中空元素。空元素为'.'

    算法分析:没填充一个数,都要看这个数所在的行,列,小矩阵是否合法。然后还要看整个数独表是否正确,而判断整个数独表只能通过递归,因为前一个结果的判断要依赖后一个结果。这应该属于动态规划问题。要递归回溯。

    public void solveSudoku(char[][] board) {
            solve(board);
        }
        
        public boolean solve(char[][] board)
        {
            for(int i = 0; i < 9; i ++)
            {
                for(int j = 0; j < 9; j ++)
                {
                    if(board[i][j] == '.')
                    {
                        for(int k = 1; k <= 9; k ++)
                        {
                            board[i][j] = (char) (k+'0');
                            if(isValid(board, i, j) && solve(board))//当前有多个选择要递归回溯
                            {
                                return true;
                            }
                            board[i][j] = '.';
                        }
                        return false;
                    }
                }
            }
            return true;
        }
        
        public boolean isValid(char[][] board, int i ,int j)
        {
            HashSet<Character> set = new HashSet<>();
            for(int k = 0; k < 9; k ++)
            {
                if(set.contains(board[i][k]))
                {
                    return false;
                }
                if(board[i][k]!='.')
                {
                    set.add(board[i][k]);
                }
            }
            set.clear();
            for(int k = 0; k < 9; k ++)
            {
                if(set.contains(board[k][j]))
                {
                    return false;
                }
                if(board[k][j]!='.')
                {
                    set.add(board[k][j]);
                }
            }
            set.clear();
            for(int m = 0; m < 3; m ++)
            {
                for(int n = 0; n < 3; n ++)
                {
                    int x = i/3*3+m;
                    int y = j/3*3+n;
                    if(set.contains(board[x][y]))
                    {
                        return false;
                    }
                    if(board[x][y]!='.')
                    {
                        set.add(board[x][y]);
                    }
                }
            }
            return true;
        }
  • 相关阅读:
    Kubernetes(k8s)1.12.2集群搭建
    Drools规则引擎入门指南(三)——使用Docker部署Workbench
    Drools规则引擎入门指南(二)
    网络协议 11
    网络协议 10
    网络协议 9
    网络协议 8
    网络协议 7
    网络协议 6
    网络协议 5
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5578171.html
Copyright © 2011-2022 走看看