【力扣】36. 有效的数独 - 力扣(LeetCode)

这里主要是记录一些我做这个题遇到的问题及解决办法

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;
}
  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值