• Valid sudoku, 是否是有效的数独


    问题描述:给定9x9矩阵,看是是否是有效数独,不用全部都填上数字,可以为.

    算法分析:这道题就是判断,不难,有效数独三个充分条件,行,列,3*3子矩阵,都要满足数字不能重复。

     1 public boolean isValidSudoku(char[][] board)
     2     {
     3         if(board == null || board.length != 9 || board[0].length != 9)
     4         {
     5             return false;
     6         }
     7         
     8         //判断行
     9         for(int i = 0; i < 9; i ++)
    10         {
    11             boolean[] m = new boolean[9];
    12             for(int j = 0; j < 9; j ++)
    13             {
    14                 if(board[i][j] != '.')
    15                 {
    16                     //if(m[(int)board[i][j]])这样写是错误的,因为(int)'1'不等于1.
    17                     if(m[(int)(board[i][j]-'1')])
    18                     {
    19                         return false;
    20                     }
    21                     m[(int)(board[i][j]-'1')] = true;
    22                 }
    23             }
    24         }
    25         
    26         //判断列
    27         for(int i = 0; i < 9; i ++)
    28         {
    29             boolean[] m = new boolean[9];
    30             for(int j = 0; j < 9; j ++)
    31             {
    32                 if(board[j][i] != '.')
    33                 {
    34                     if(m[(int)(board[j][i]-'1')])
    35                     {
    36                         return false;
    37                     }
    38                     m[(int)(board[j][i]-'1')] = true;
    39                 }
    40             }
    41         }
    42         
    43         //判断3*3矩阵,总共有9个
    44         for(int k = 0; k < 9; k ++)
    45         {
    46             boolean[] m = new boolean[9];
    47             for(int i = k/3*3; i < k/3*3 + 3; i ++)
    48             {
    49                 for(int j = k%3*3; j < k%3*3 + 3; j ++)
    50                 {
    51                     if(board[i][j] != '.')
    52                     {
    53                         if(m[(int)(board[i][j]-'1')])
    54                         {
    55                             return false;
    56                         }
    57                         m[(int)(board[i][j]-'1')] = true;
    58                     }
    59                 }
    60             }
    61         }
    62         
    63         return true;
    64     }

     还有一种方法,就是直接用set集合,判断元素是否重复。

     1 public boolean isValidSudoku(char[][] board) {
     2         for(int i = 0; i < 9; i ++)
     3         {
     4             Set<Character> set = new HashSet<>();
     5             for(int j = 0; j < 9; j ++)
     6             {
     7                 if(board[i][j] != '.')
     8                 {
     9                     if(set.contains(board[i][j]))
    10                     {
    11                         return false;
    12                     }
    13                     set.add(board[i][j]);
    14                 }
    15             }
    16             set.clear();
    17         }
    18         
    19         for(int i = 0; i < 9; i ++)
    20         {
    21             Set<Character> set = new HashSet<>();
    22             for(int j = 0; j < 9; j ++)
    23             {
    24                 if(board[j][i] != '.')
    25                 {
    26                     if(set.contains(board[j][i]))
    27                     {
    28                         return false;
    29                     }
    30                     set.add(board[j][i]);
    31                 }
    32             }
    33             set.clear();
    34         }
    35         
    36         for(int k = 0; k < 9; k ++)
    37         {
    38             Set<Character> set = new HashSet<>();
    39             for(int j = k/3*3; j < k/3*3+3; j ++)
    40             {
    41                 for(int i = k%3*3; i < k%3*3+3; i ++)
    42                 {
    43                     if(board[j][i] != '.')
    44                     {
    45                         if(set.contains(board[j][i]))
    46                         {
    47                             return false;
    48                         }
    49                         set.add(board[j][i]);
    50                     }
    51                 }
    52             }
    53             set.clear();
    54         }
    55         
    56         return true;
    57     }
  • 相关阅读:
    最大化等比例测试演化Demo-传统方法
    Layout-3相关代码:3列布局代码演化三]
    Layout-3相关代码:3列布局代码演化[二]
    Layout-2相关代码:3列布局代码演化[一]
    Layout-1相关代码
    【比赛打分展示双屏管理系统-专业版】Other.ini 配置文件解读以及排行榜界面及专家评语提交展示等具体配置
    Android 开源简单控件
    Android Drawable资源
    Android Service与Thread的区别
    Android事件处理
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5577482.html
Copyright © 2020-2023  润新知