Leetcode 36 有效的数独(C语言)

该文描述了一种用于解决数独问题的算法,通过遍历每一行、每一列以及3x3的小宫格来检查数字是否重复。如果在任何一行、一列或3x3的宫格中发现重复,算法将返回false,表示数独不合法。这种方法利用了多重循环,但由于数据量小,不会导致超时问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:首先每一行遍历查找是否重复,在每一列查找重复,最后对3*3框框进行遍历查找是否重复

tips:由于数据量较少,不用害怕使用多重循环导致超时

第一步:

 for(int i=0;i<9;i++)
    {//i控制行
        for(int j=0;j<9;j++)
        {//j控制每列
            for(int m=j+1;m<9;m++)
            {//对该行的这个数进行比对,判断在该行是否有重复
               if(board[i][j]!='.')
               {
                   if(board[i][j]==board[i][m])
                   {
                       return false;
                   }
               }
            }
        }
    }

对每列的查找可以用类似的方法得到

接下来:

int flag;//设置标志变量,判断数是否重复出现
   int val1=0,val2=0;//为了简化代码,再设置两个变量,控制每个3*3框框位置
   while(val1<=6)//最外层两个while循环是为了减少代码量
   {
       val2=0;
     while(val2<=6)
    {

       for(int m=1;m<=9;m++)
    {   
         flag=0;
          for(int i=val1;i<val1+3;i++)
        {
         for(int j=val2;j<val2+3;j++)
        {
          
              if(board[i][j]==m+'0')
              {
                  flag++;
              }
          }

       }

       if(flag>1)
       {
           return false;
       }

    }

        val2=val2+3;
       }
       
      val1=val1+3;
   }

多重嵌套循环光看代码容易头晕,建议通过执笔从外向内一步一描述

最后有什么疑问,可以在下方留言。虽然我也不一定会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值