Isvalid Sudo

判断一个数独是否有效,

说明:

一个有效的数独(填了一部分的)不一定是可解的,只要已经填的数字是有效的即可。

分析:

该题目不要判断整个数独是否有解,只需要判断当前给出的数独是否有效。因此只需要判断行和列是否有效,判断每个块是否有效。而判断一行中是否有重复的数字,最好的数据结构莫过于Set结构了。

使用rowSet,colSet两个Set结构来分别保存当前遍历的行和列,(i, j)表示行,则(j, i)就表示列。因此可以在判断第一行是否有效的同时,顺便判断第一列是否有效;块单独做检查;

public boolean isValidSudoku(char[][] board) {
    	if(board == null || board.length != 9 || board[0].length != 9)
    		return false;
    	Set<Character> rowset = new HashSet<>();
    	Set< Character> colset = new HashSet<>();
    	
        for(int i = 0; i < board.length; i++){
        	rowset.clear();
        	colset.clear();
        	for(int j = 0; j < board[0].length; j++){
        		if(board[i][j] != '.'){//检验行是否有重复
        			if(rowset.contains(board[i][j])){
        				return false;	
        			}
        			rowset.add(board[i][j]);
        		}
        		if(board[j][i] != '.'){//检验列是否重复
        			if(colset.contains(board[j][i])){
        				return false;
        			}
        			colset.add(board[j][i]);
        		}
        		if(i%3 == 0 && j%3 == 0){
        			if(!bloack(i,j,board)){
        				return false;
        			}
        			
        		}
        		
        		
        	}
        }
        return true;
    }
    public boolean bloack(int i, int j, char[][] board) {
		// TODO Auto-generated method stub
    	Set<Character> blockset = new HashSet<>();
    	for(int a = i; a < i+3; a++){
    		for(int b = j; b < j+3; b++){
    			if(board[a][b] != '.'){
    				if(blockset.contains(board[a][b])){
    					return false;
    				}
    				blockset.add(board[a][b]);    			
    			}
    			
    		}   		
    	}
		return true;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值