leetcode——Valid Sudoku

本文讨论了如何根据数独游戏规则验证数独板的有效性,强调了仅需验证填充的数字合法性的要点,提供了AC代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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.

Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

思路:

本题的重点不在于算法(本题不需要用到什么算法,因此属于简单类型),而是在于Note中的强调。

一开始我的思路是将该数独解出来,得到解则为true,得不到则为false。但是这样需要一个NP的复杂度,超时。

后来仔细看了一下题目,发现数独的valid的定义是:Only the filled cells need to be validated.也就是仅仅需要将已有的数字进行验证是否合法即可。

那么,解答思路仅仅是,对于每一个数字,判断每行、每列和每宫 是否合法。

合法,即在该行,该列和该宫都只出现一次。


AC代码:

public class Valid_Sudoku {
    
    private boolean isAvalible(char[][] board, int r,int c){
        char i=board[r][c];
        int a = r/3,b=c/3;
        int beginX = 3*a,beginY = 3*b;
        int count=0;
        int j;
        for(j=0;j<board.length ;j++){
            if(j==c)
                continue;
            if(board[r][j]==(""+i).charAt(0))
                break;
        }
        if(j==board.length)
            count++;

        if(count==1){
            for(j=0;j<board.length;j++){
                if(j==r)
                    continue;
                if(board[j][c]==(""+i).charAt(0))
                    break;
            }
            if(j==board.length)
                count++;

            if(count==2){
                boolean flag=false;
                for(int cc=beginX;cc<beginX+3 && !flag;cc++)
                    for(int dd=beginY;dd<beginY+3 && !flag;dd++){
                        if(cc==r && dd==c)
                            continue;
                        if(board[cc][dd]==(""+i).charAt(0))
                            flag=true;
                    }
                if(!flag)
                    count++;
                if (count==3){
                    return true;
                }
            }

        }
        return false;
    }
    
    public boolean isValidSudoku(char[][] board) {
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board.length;j++){
                if(board[i][j]!='.'){
                    if(!isAvalible(board,i,j)){
                        return false;
                    }
                }
            }
        }
        return true;
    }
    public static void main(String[] args){
        Valid_Sudoku valid_sudoku = new Valid_Sudoku();
        char[][] board = {{'5','3','.','.','7','.','.','.','.'},
                          {'6','.','.','1','9','5','.','.','.'},
                          {'.','9','8','.','.','.','.','6','.'},
                          {'8','.','.','.','6','.','.','.','3'},
                          {'4','.','.','8','.','3','.','.','1'},
                          {'7','.','.','.','2','.','.','.','6'},
                          {'.','6','.','.','.','.','2','8','.'},
                          {'.','.','.','4','1','9','.','.','5'},
                          {'.','.','.','.','8','.','.','7','9'}};

        System.out.println(valid_sudoku.isValidSudoku(board));
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值