leetcode之Valid Sudoku

来源:互联网 发布:macbook装office软件 编辑:程序博客网 时间:2024/05/22 16:56

原题如下:

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

The Sudoku board could be partially filled, where empty cells are filled with the character '.'.


A partially filled sudoku which is valid.

Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

始终没明白出这道题的目的是什么,是要考察对for循环的掌握情况吗,那嵌套4个for循环的效率不会太高吧,算了,说下思路:即对三个条件分别检查,有一项不满足即可退出并返回false,都满足条件的情况下返回true,第一个条件是所有行中没有重复元素,第二个条件是所有列中没有重复元素,第三个条件是9宫格中的每个单元格中没有重复元素,好吧,写到这我才明白过来原来这个数组的大小是固定的,是我想复杂了。。。看来还是要首先把题意理解透彻再编码。对第三个条件的检查循环次数其实是固定的,不过我的编码更具扩展性(又为自己辩解了。。。)

class Solution {public:    bool isValidSudoku(vector<vector<char> > &board) {int m = board.size();int n = board[0].size();for(int i = 0; i < m; i++){// 对每一行检验set<char>s;pair<set<char>::iterator,bool> ret;for(int j = 0; j < n; j++){if(board[i][j] !='.'){ret = s.insert(board[i][j]);if(ret.second == false)return false;}}}for(int j = 0; j < n; j++){//对每一列检验set<char>s;pair<set<char>::iterator,bool> ret;for(int i = 0; i < m; i++){    if(board[i][j] !='.'){ret = s.insert(board[i][j]);if(ret.second == false)return false;   }   }}for(int i = 0; i < m - 2; i = i + 3){//检查子模块for(int j = 0; j < n - 2; j = j + 3){set<char>s;    pair<set<char>::iterator,bool> ret;for(int r = i; r < i + 3; r++){for(int k = j; k < j + 3; k++){if(board[r][k] !='.'){ret = s.insert(board[r][k]);if(ret.second == false)return false;}}}}}return true;    }};
通过这道题学习了set的基本用法,特别是set插入元素的方法返回值是pair,可以根据pair.second的返回值来查看插入是否成功。

0 0
原创粉丝点击