zoukankan      html  css  js  c++  java
  • Leetcode36--->Valid Sudoku(判断给定的数独是否有效)

    题目:给定一个数独,某些部分已经被填上了数字,其余空的地方用‘.’表示;判断给定的数独是否有效;

    数独规则: 每一行不能有重复的数字;每一列不能有重复的数字;将数独框划分为三行三列,没9个小方格不能有重复;

    解题思路:

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

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

    代码如下:

     1 public class Solution {
     2     public boolean isValidSudoku(char[][] board) {
     3         if(board == null || board.length < 9 || board[0].length < 9)
     4             return false;
     5         Set<Character> rowset = new HashSet<Character>();
     6         Set<Character> colset = new HashSet<Character>();
     7        
     8         for(int i = 0; i < 9; i++)
     9         {
    10             rowset.clear();
    11             colset.clear();
    12             for(int j = 0; j < 9; j ++)
    13             {
    14                 if(i % 3 == 0 && j % 3 == 0)  // 检查块是否有效
    15                 {
    16                     if(!checkBlock(board, i, j))
    17                         return false;
    18                 }
    19                 if(board[i][j] != '.')  // 检查行是否有效
    20                 {
    21                     if(rowset.contains(board[i][j]))
    22                         return false;
    23                     rowset.add(board[i][j]);
    24                 }
    25                 if(board[j][i] != '.')  // 检查列是否有效
    26                 {
    27                     if(colset.contains(board[j][i]))
    28                         return false;
    29                     colset.add(board[j][i]);
    30                 }
    31             }
    32         }
    33         return true;
    34         
    35     }
    36     public boolean checkBlock(char[][] board, int row, int col)  // 检查块是否有效
    37     {
    38         Set<Character> blockSet = new HashSet<Character>();
    39         for(int i = row; i < row + 3; i++)
    40         {
    41             for(int j = col; j < col + 3; j++)
    42             {
    43                 if(board[i][j] != '.')
    44                 {
    45                     if(blockSet.contains(board[i][j]))
    46                         return false;
    47                     blockSet.add(board[i][j]);
    48                 }
    49             }
    50         }
    51         return true;
    52     }
    53 }
  • 相关阅读:
    XML 增、删、改和查示例
    DataGrid 完全攻略之三(实现删除全选或者全不选)
    DataGrid 完全攻略之七(实现选择、编辑和修改)
    ASP.NET 2.0,无刷新页面新境界
    DataGrid 完全攻略之二(把数据导出到Excel)
    ASP.NET 2.0角色及成员管理
    动态改变页面的CSS样式
    ASP.NET 2.0新控件、管理外观、布局及其它用户体验
    页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置?
    20100120 ~ 20100220 小结与本月计划
  • 原文地址:https://www.cnblogs.com/leavescy/p/5899216.html
Copyright © 2011-2022 走看看