valid-sudoku

/**
* Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
* The Sudoku board could be partially filled, where empty cells are filled with the character '.'.
* A partially filled sudoku which is valid.
*
* 根据以下规则确定数独是否有效:
* 数独板可以部分填充,其中空单元格填充字符 “ . ”。就是 空的单元格用 . 来代替。
* 一个部分填充的数独是有效的。
*/

解析:
* 这道题目的意思是 这个数独是否有效,返回 true, false.
* 有三种情况不成立,将返回false:
* 第一种: 循环每一行, 如果出现了相同的数字就不成立, 遇到 . 直接跳过
* 第二种: 循环每一列, 如果出现了相同的数字就不成立, 遇到 . 直接跳过
* 第三种: 循环每一个小的九宫格, 如果出现了相同的数字就不成立, 遇到 . 直接跳过(这个需要注意一下循环的方法,规律)

import java.util.HashSet;
import java.util.Set;

/**
 * Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
 * The Sudoku board could be partially filled, where empty cells are filled with the character '.'.
 * A partially filled sudoku which is valid.
 *
 * 根据以下规则确定数独是否有效:
 * 数独板可以部分填充,其中空单元格填充字符 “ . ”。就是 空的单元格用 . 来代替。
 * 一个部分填充的数独是有效的。
 *
 * 解析:
 * 这道题目的意思是 这个数独是否有效,返回 true, false.
 * 有三种情况不成立,将返回false:
 *      第一种: 循环每一行, 如果出现了相同的数字就不成立, 遇到 . 直接跳过
 *      第二种: 循环每一列, 如果出现了相同的数字就不成立, 遇到 . 直接跳过
 *      第三种: 循环每一个小的九宫格, 如果出现了相同的数字就不成立, 遇到 . 直接跳过(这个需要注意一下循环的方法,规律)
 */

public class Main40 {
    public static void main(String[] args) {
        char[][] board = {
                {'.','.','4','.','.','.','6','3','.'},
                {'.','.','.','.','.','.','.','.','.'},
                {'5','.','.','.','.','.','.','9','.'},
                {'.','.','.','5','6','.','.','.','.'},
                {'4','.','3','.','.','.','.','.','.'},
                {'.','.','.','7','.','.','.','.','.'},
                {'.','.','.','1','.','.','.','.','.'},
                {'.','.','.','.','.','.','.','.','.'},
                {'.','.','.','.','.','.','.','.','.'}
        };
        System.out.println(Main40.isValidSudoku(board));
    }

    public static boolean isValidSudoku(char[][] board) {
        Set<Character> set = new HashSet<>();
        // 第一种情况:
        for (int i=0;i<board.length;i++) {
            for (int j=0;j<board[i].length;j++) {
                if (board[i][j] == '.') {
                    continue;
                }
                if (!set.contains(board[i][j])) {
                    set.add(board[i][j]);
                }else{
                    return false;
                }
            }
            set.clear();
        }
        // 第二种情况:
        for (int j=0;j<board[0].length;j++) {
            for (int i=0;i<board.length;i++) {
                if (board[i][j] == '.') {
                    continue;
                }
                if (!set.contains(board[i][j])) {
                    set.add(board[i][j]);
                }else{
                    return false;
                }
            }
            set.clear();
        }
        // 第三种情况:
        for (int k=0;k<board.length;k++) {
            for (int i=k/3*3;i<k/3*3+3;i++) {
                for (int j=k%3*3;j<k%3*3+3;j++) {
                    if (board[i][j] == '.') {
                        continue;
                    }
                    if (!set.contains(board[i][j])) {
                        set.add(board[i][j]);
                    }else{
                        return false;
                    }
                }
            }
            set.clear();
        }
        return true;
    }
}

  

原文地址:https://www.cnblogs.com/strive-19970713/p/11320292.html