题解 | #Sudoku#

Sudoku

https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1

设0的数量是num,信息量就是9的num次方,令最大寻找次数等于信息量,就不会出错

#include <stdio.h>
int mat[9][9];
int lable;
int check(int row,int col,int val)
{
    for(int i=0;i<9;i++)
    if(mat[row][i]==val)return 0;
    for(int i=0;i<9;i++)
    if(mat[i][col]==val)return 0;
    for(int i=(col/3)*3;i<(col/3)*3+3;i++)
    for(int j=(row/3)*3;j<(row/3)*3+3;j++)
    if(mat[j][i]==val)return 0;
    return 1;
}
void dfsmat(int a,int b)
{
    if(b==9)
    {
    a+=1;
    b=0;
    }
    if(a==9){lable=1;return;}
    if(mat[a][b]==0)
    for(int i=1;i<=9;i++)
    {
        if(check(a,b,i)==1)
        {
           mat[a][b]=i;
           dfsmat(a,b+1);//进入下一层找通道
           if(lable==1)//拿到钥匙后直接出循环
           return;
           mat[a][b]=0;
        }
    }
    else dfsmat(a,b+1);
}
int main() {
      for(int i=0;i<9;i++)
      for(int j=0;j<9;j++)
      scanf("%d",&mat[i][j]);
      dfsmat(0,0);
      for(int i=0;i<9;i++)
      {
      for(int j=0;j<9;j++)
      printf("%d ",mat[i][j]);
      printf("\n");
      }
      return 0;
}

全部评论

相关推荐

10-22 19:44
门头沟学院 Java
面了100年面试不知...:那我得去剪个头
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务