• 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,因此会越界,结果当然不对。这些细节问题,是自己粗心造成的,太不应该。

  • 相关阅读:
    C#规范整理·异常与自定义异常
    C#规范整理·资源管理和序列化
    C#规范整理·泛型委托事件
    C#规范整理·集合和Linq
    <抽象工厂>比<工厂方法>多了啥(区别)
    <工厂方法>比<简单工厂>多了啥(区别)
    Unable to start Ocelot because either a ReRoute or GlobalConfiguration
    MySQL服务安装
    mysql登录报错“Access denied for user 'root'@'localhost' (using password: YES”)的处理方法
    使用博客系统发生_STORAGE_WRITE_ERROR_错误
  • 原文地址:https://www.cnblogs.com/zhizhizhiyuan/p/3802683.html
Copyright © 2020-2023  润新知