leetcode 36 有效的数独

咋办呢,只会暴力算法,9行9列9个9宫格,疯狂遍历完事,贴代码

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) 
    {
        for(int i = 0 ; i < 9 ; i++)              //9行
        {
            unordered_map<char,int> good;
            for(int j = 0 ; j < 9 ; j++)
            {
                if(board[i][j]!='.' )
                {
                    if(good.count(board[i][j])==0)
                    good.insert(pair<int,char>(board[i][j],1));
                    else
                    return false;
                }
            }
        }
        for(int i = 0 ; i < 9 ; i++)              //9列
        {
            unordered_map<char,int> good;
            for(int j = 0 ; j < 9 ; j++)
            {
                if(board[j][i]!='.' )
                {
                    if(good.count(board[j][i])==0)
                    good.insert(pair<int,char>(board[j][i],1));
                    else
                    return false;
                }
            }
        }
        for(int i = 0 ; i < 3 ; i++)                         //9个九宫格
        {
            for(int j = 0 ; j < 3 ; j ++)
            {
                unordered_map<char,int> good;
                int m = 3*i;
                int n = 3*j;
                for(int p = 0 ; p < 3 ; p++)
                {
                    for(int q = 0 ; q < 3 ; q++)
                    {
                        if(board[m+p][n+q]!='.' )
                        {
                            if(good.count(board[m+p][n+q])==0)
                            good.insert(pair<int,char>(board[m+p][n+q],1));
                            else
                            return false;
                        }  
                    }
                }
            }
        }
        return true;
    }
};

有个方法,就是先创建三个数组,都是9*9,分别为9行,9列,9个9宫格服务。通过一次遍历,每遍历到一个数字,就在对应的行,列,九宫格的数组位上置1,代表这个数所在的行,列,九宫格中已经出现了该数字,下一次再出现该数字,则说明出现重复,判断错误,下面贴代码。

vector<vector<int>> row (9, vector<int>(9,0));
        vector<vector<int>> col (9, vector<int>(9,0));
        vector<vector<int>> box (9, vector<int>(9,0));

        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                if(board[i][j] == '.'){
                    continue;
                }
                int val = board[i][j] - '1';
                int box_index = (i/3) * 3 + j/3;
                if(row[i][val] == 0 && col[j][val] == 0 && box[box_index][val] == 0){
                    row[i][val] = 1;
                    col[j][val] = 1;
                    box[box_index][val] = 1;
                }
                else{
                    return false;
                }
            }
        }
        return true;

 

posted @ 2021-03-06 16:48  zhaohhhh  阅读(55)  评论(0)    收藏  举报