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) 编辑 收藏 举报