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

  • 相关阅读:
    SmartJS 第一期(0.1)发布
    smartJS 0.1 API 讲解
    smartJS 0.1 API 讲解
    20160113006 asp.net实现ftp上传代码(解决大文件上传问题)
    20151224001 GridView 多按钮的各种使用方法
    20151221001 GridView 模板
    20151218001 雕爷自白:我为什么非要这么干
    20151210001 DataGridView 选中与被选中
    20151126001 网页中嵌入谷歌动态地图
    20151125001 询问对话框 中的文字换行
  • 原文地址:https://www.cnblogs.com/zhizhizhiyuan/p/3802683.html
Copyright © 2011-2022 走看看