首页 > 代码库 > leetcode第一刷_Valid Sudoku
leetcode第一刷_Valid Sudoku
一开始没看清题,以为让当场求数独呢,吓得一直没敢做。后来发现这个题原来如此之简单,只要判断现在棋盘上的数字满不满足情况要求就可以了。
这不就是三次循环吗。。看看每一行满不满足,每一列满不满足,每个小的3*3的格子满不满足就行了。每个小3*3格子我是用求得左上角的方法来验证的。
其实觉得数独难还有一个原因是记得他在编程之美上出现过。。那上面讨论的主要是怎样构造一个数独,具体记不太清楚了,印象最深的是,要想保证有解,最好的办法是先用置换法生成一个解,然后去掉这个解中的一些位置。
class Solution { public: bool isValidSudoku(vector<vector<char> > &board) { bool vis[10]; for(int start=0;start<9;start++){ int i = start/3, j = start%3; memset(vis, 0, sizeof(vis)); for(int k=0;k<9;k++){ int ii=i*3+k/3, jj=j*3+k%3; if(board[ii][jj] == ‘.‘) continue; if(vis[board[ii][jj]-‘0‘]) return false; else vis[board[ii][jj]-‘0‘] = 1; } } for(int i=0;i<9;i++){ memset(vis, 0, sizeof(vis)); for(int j=0;j<9;j++){ if(board[i][j]==‘.‘) continue; if(vis[board[i][j]-‘0‘]) return false; vis[board[i][j]-‘0‘] = 1; } } for(int i=0;i<9;i++){ memset(vis, 0, sizeof(vis)); for(int j=0;j<9;j++){ if(board[j][i]==‘.‘) continue; if(vis[board[j][i]-‘0‘]) return false; vis[board[j][i]-‘0‘] = 1; } } return true; } };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。