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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值