Skip to content

Latest commit

 

History

History
68 lines (48 loc) · 1.92 KB

036.md

File metadata and controls

68 lines (48 loc) · 1.92 KB

Valid Sudoku

题目:

确保数独的初始状态是否有效,同一行,同一列,一个九宫格内1-9只能出现一次。

思路

使用三个二维表格table_row,table_col,table_cube分别记录行,列,九宫格是否出现相同元素。初始化为0。

table_row的第一行表示board的第一行元素,table_row[i][j] = 1,表示第i行值为j 已经出现过。

table_col的第一行表示board的第一列元素,table_col[i][j] = 1.表示第i列值为j 已经出现过

就九宫格记为

0 1 2

3 4 5

6 7 8

table_cube的第k行表示board的第个k宫格 ,table_cube[i][j] = 1 ,表示第i个九宫格值为j 已经出现过。

九宫格下标转为标号: 假设board[i][j]-->(i/2*)3+j/3。

代码

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        const int ROW = 9,COL=9;
        //使用三个表分别记录行,列,九宫格是否重复出现。
        int table_row[ROW][COL],table_col[ROW][COL],table_cube[ROW][COL];
        //初始化为0
        for(int i=0;i<ROW;++i){
            for(int j=0;j<COL;++j){
                table_row[i][j]=table_col[i][j]=table_cube[i][j]=0;
            }
        }
        
        for(int i=0;i<ROW;++i){
            for(int j=0;j<COL;++j){
                int num = 0;
                if(board[i][j]=='.') continue;
                else
                    num = board[i][j]-'0'-1;
                if(table_row[i][num]==0 && table_col[j][num]==0 
                   && table_cube[(i/3)*3+j/3][num]==0){
                               //^^^^^^^^^^^ 将就九宫格转换为对应的行。
                    table_row[i][num] = 1; 
                    table_col[j][num] = 1;
                    table_cube[(i/3)*3+j/3][num] = 1;
                }else{
                   
                    return false;
                }
                
            }
        }    
        return true;
       
    }
};