zoukankan      html  css  js  c++  java
  • [Leetcode] 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.

     题意:判断矩阵是否是一个数独矩阵。所谓的数独矩阵就是9*9的矩阵,每一行一个元素只出现一次、每一列一个元素只出现一次,并且在任意一个小矩阵(3×3)中一个元素只出现一次(所说的元素指0-9这九个数字)。a)第i个九宫格的第j个格点的行号可表示为i/3*3+j/3;b)第i个九宫格的第j个格点的列号可表示为i%3*3+j%3(详见陆草纯的博客)。整体的思路是:开辟三个二维标志数组,m[i][j]表示当前的这个位置,是否被访问过。

    代码一陆草纯的博客,代码如下:

     1 class Solution {
     2 public:
     3     bool isValidSudoku(vector<vector<char> > &board) {
     4         for(int i = 0; i < 9; i ++)
     5         {
     6             unordered_map<char, bool> m1;   //check i_th row
     7             unordered_map<char, bool> m2;   //check i_th column
     8             unordered_map<char, bool> m3;   //check i_th subgrid
     9             for(int j = 0; j < 9; j ++)
    10             {
    11                 if(board[i][j] != '.')
    12                 {
    13                     if(m1[board[i][j]] == true)
    14                         return false;
    15                     m1[board[i][j]] = true;
    16                 }
    17                 if(board[j][i] != '.')
    18                 {
    19                     if(m2[board[j][i]] == true)
    20                         return false;
    21                     m2[board[j][i]] = true;
    22                 }
    23                 if(board[i/3*3+j/3][i%3*3+j%3] != '.')
    24                 {
    25                     if(m3[board[i/3*3+j/3][i%3*3+j%3]] == true)
    26                         return false;
    27                     m3[board[i/3*3+j/3][i%3*3+j%3]] = true;
    28                 }
    29             }
    30         }
    31         return true;
    32     }
    33 };

    因为只要考虑出现的数字是否有重复的,所以,只需用当前元素的值转化为坐标信息,访问就行。Grandyang代码二:

     1 class Solution {
     2 public:
     3     bool isValidSudoku(vector<vector<char> > &board) 
     4     {
     5         int row=board.size(),col=board[0].size();
     6         if(row !=9||col !=9)    return false;
     7 
     8         vector<vector<bool>> rowFlag(row,vector<bool>(col,false));
     9         vector<vector<bool>> colFlag(row,vector<bool>(col,false));
    10         vector<vector<bool>> cellFlag(row,vector<bool>(col,false)); 
    11 
    12         for(int i=0;i<row;++i)
    13         {
    14             for(int j=0;j<col;++j)
    15             {
    16                 if(board[i][j]>='1'&&board[i][j]<='9')
    17                 {
    18                     int c=board[i][j]-'1';
    19                     if(rowFlag[i][c]||colFlag[c][j]||cellFlag[3*(i/3)+j/3][c])
    20                         return false;
    21                     
    22                     rowFlag[i][c]=true;
    23                     colFlag[c][j]=true;
    24                     cellFlag[3*(i/3)+j/3][c]=true;
    25                 }
    26             }
    27         }   
    28         return true;
    29     }
    30 };

    想把代码一按照代码二那样写,总是通不过,抽时间再看看问题出在哪。

  • 相关阅读:
    列举⼀下 HTTP 中关于 "资源缓存" 的头部指令 (Head) 有哪些 ? 并简要介绍⼀下设置的规则 ?
    从输入URL到页面渲染完成
    git删除远程仓库分支
    @font-face的format属性
    【React】的行内样式不支持rgb
    前端面试题
    常见元素居中的五种方法
    数组存储表格数据
    java.util.Arrays类
    for-each循环
  • 原文地址:https://www.cnblogs.com/love-yh/p/7152240.html
Copyright © 2011-2022 走看看