一、 题目
数独游戏,每一行,每一列,每一个小方格中含有数字1-9且不重复,不要求数字全部出现,可以用’.’代替。判断给出方格的是否符合要求。
二、 分析
第一次玩这个游戏,不知道规则,搜之,原来就是要遍历判断,那就查询每一行,每一列,每一个方格啦!主要的技巧是在判断方格时,可以使用一个四重for循环,优化后使用一个三重循环。
class Solution { public: bool isValidSudoku(vector<vector<char> > &board) { int map[9]; //检查行 for(int i = 0; i < 9; i++){ memset(map,0,sizeof(int)*9); for(int j = 0; j < 9; j++){ if(board[i][j] != '.') if(map[board[i][j] -'1'] == 1) return false; else map[board[i][j] - '1'] = 1; } } //检查列 for(int i = 0; i < 9; i++){ memset(map,0,sizeof(int)*9); for(int j = 0; j < 9; j++){ if(board[j][i] != '.') if(map[board[j][i] -'1'] == 1) return false; else map[board[j][i] - '1'] = 1; } } //检查9个方格 for(int i = 0; i < 3; i ++){ for(int n = 0; n < 3; n++){ memset(map, 0, sizeof(int)*9); for(int j = i*3; j < 3 + i*3; j ++){ for(int k = n*3; k < 3 + n*3; k++){ if(board[j][k] != '.'){ if(map[board[j][k] - '1'] == 1) return false; else map[board[j][k] - '1'] = 1; } } } } } /*或 for(int i = 0; i < 9; i ++){ memset(map, 0, sizeof(int)*9); for(int j = i/3*3; j < 3 + i/3*3; j ++){ for(int k = i%3*3; k < 3 + i%3*3; k++){ if(board[j][k] != '.'){ if(map[board[j][k] - '1'] == 1) return false; else map[board[j][k] - '1'] = 1; } } } } */ return true; } };
原文地址:http://blog.csdn.net/zzucsliang/article/details/43852445