这里主要是记录一些我做这个题遇到的问题及解决办法
目录
1.问题描述
1.1 思路分析:
对于个题目而言,我只使用了一个参数,其中我的主要思路就是暴力循环求解,总体思路就是先判断每行是否符合要求,在判断每列是否符合要求、然后再判断每个小方块是否符合要求;
对行列进行检查的思路,首先明确,如果对一个数组进行排序,如果使用暴力循环,那么双层循环即可,因此对于这个数独,每一行和每一列都可以单独看成一个数组,然后进行依次判断是否有相同的就行,如果有就返回false,如果真就返回true;这个是比较好判断的;
对于循环判断的难点就是最后一个如何进行判断,因为这不像一行或者一列的进行判断,如果是一行或者是一列就好判断了,因此我们可以思考把这三行三列的小方块拉直
,这样问题就转换成了对一行数组进行判断是否有相同的元素,这样就简单很多了,而具体的实现可以看看代码,尤其是最后对这9个小方块的处理,
9个小方块如何与循环联系起来,其中可以观察,首先是行数的变换肯定是在最外循环圈,因此每次加三就行,而对于列循环肯定是在内圈,而且行数变换一次,列数就要循环变换三次,因此列数每次加三是在内循环,而最里面的循环就是先进行拉直处理,然后进行判断数组元素是否相等,具体细节可以参考代码,由于使用的是暴力循环,思路比较简单,因此就不梳理整体流程图了
2.程序代码及注释:
代码效率中等,还有改进空间
bool isValidSudoku(char** board, int boardSize, int* boardColSize) {
int i, j, k, column, row;
column = 0;
row = 0;
char str[9];
// 检测行符不符合要求
for (k = 0; k < 9; k++) {
for (i = 0; i < 9; i++) {
if (board[k][i] == '.') {
continue;
}
for (j = i + 1; j < 9; j++) {
if (board[k][i] == board[k][j]) {
return false;
}
}
}
}
// 检测列符不符合要求
for (k = 0; k < 9; k++) {
for (i = 0; i < 9; i++) {
if (board[i][k] == '.') {
continue;
}
for (j = i + 1; j < 9; j++) {
if (board[i][k] == board[j][k]) {
return false;
}
}
}
}
// 对小方块进行检测,一共是9个小方块
for (row = 0; row < 9; row += 3) {
for (column = 0; column < 9; column += 3) {
k = 0;
// 把小方块拉直
for (i = 0 + row; i < 3 + row; i++) {
for (j = 0 + column; j < 3 + column; j++) {
str[k] = board[i][j];
k++;
}
}
// 对拉直的进行判断是否符合要求
for (i = 0; i < 9; i++) {
if (str[i] == '.') {
continue;
}
for (j = i + 1; j < 9; j++) {
if (str[i] == str[j]) {
return false;
}
}
}
k = 0;
}
}
return true;
}
标签:column,++,36,力扣,小方块,循环,board,数独,row
From: https://blog.csdn.net/w384829981/article/details/137081094