zhizhizhiyuan

Valid Sudoku

  理解题目的意思后这题不难。扫描一遍数独输入并按照要求进行判断就可以了。提交了两次,第一次用了stl的set,第二次本来想借助位运算的,想想觉得有些操作略显麻烦,因此用整数数组代替。代码如下:

  解法一:

  

class Solution {
public:
    bool isValidSudoku(vector<vector<char> > &board) {
        set<char> rowSet;
        set<char> colSets[9];
        set<char> subSets[9];
        set<char>::iterator itr;
        char c;
        for(int i=0;i<9;i++)
        {
            rowSet.clear();
            for(int j=0;j<9;j++)
            {
                c=board[i][j];
                if(c=='.')
                {
                    continue;
                }
                else
                {
                    if(rowSet.find(c)==rowSet.end())
                    {
                        rowSet.insert(c);
                    }
                    else
                        return false;
                    if(colSets[j].find(c)==colSets[j].end())
                    {
                        colSets[j].insert(c);
                    }
                    else
                        return false;
                    int idx=3*(i/3)+j/3;
                    if(subSets[idx].find(c)==subSets[idx].end())
                    {
                        subSets[idx].insert(c);
                    }
                    else
                        return false;
                }
            }
        }
        return true;
    }
};

  解法二:

  

class Solution {
public:
    bool isValidSudoku(vector<vector<char> > &board) {
        int rowMap[9];
        int colMaps[9][9];
        int subMaps[9][9];
        char c;
        int iv;
        int subIdx;
        memset(colMaps,0,sizeof(colMaps));
        memset(subMaps,0,sizeof(subMaps));
        for(int i=0;i<9;i++)
        {
            memset(rowMap,0,sizeof(rowMap));
            for(int j=0;j<9;j++)
            {
                c=board[i][j];
                if(c=='.')
                    continue;
                iv=c-'0'-1;
                if(rowMap[iv]==1)
                    return false;
                rowMap[iv]=1;
                if(colMaps[j][iv]==1)
                    return false;
                colMaps[j][iv]=1;
                subIdx=(i/3)*3+j/3;
                if(subMaps[subIdx][iv]==1)
                    return false;
                subMaps[subIdx][iv]=1;
            }
        }
        return true;
    }
};

  本质上来说解法一和解法二没有什么区别。但解法二是使用数组直接寻址,因此理论上来说效率应该更高。在使用解法二的过程中,代码一直不能AC,无奈只能一步一步调试,最终定位到"iv=c-'0'-1"这一行。原来是"iv=c-'0',但数独的输入其实是1-9,因此会越界,结果当然不对。这些细节问题,是自己粗心造成的,太不应该。

posted on 2014-06-22 16:21  zhizhizhiyuan  阅读(141)  评论(0编辑  收藏  举报

导航