题解 | #Sudoku#

Sudoku

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

#include <stdio.h>
#define SIZE 9

int mp[SIZE][SIZE]={0};;//存储数独
int find_answer_ok;
int check(int row, int col, int val)
{   //检验在当前位置填入val后,满足要求与否
    //同行
    for(int i = 0; i < 9; i++)
    {
        if(mp[row][i] == val)
        {
            return 0;
        }
    }
    
    //同列
    for(int i = 0; i < 9; i++)
    {
        if(mp[i][col] == val)
        {
            return 0;
        }
    }
  
    //同一个九宫格
    int limit_row = row / 3 * 3 + 3;//九宫格行的终点
    int limit_col = col / 3 * 3 + 3;//九宫格列的终点
    for(int i = limit_row - 3; i < limit_row; i++)
    {
        for(int j = limit_col - 3; j < limit_col; j++)
        {
            if(mp[i][j] == val)
            {
                return 0;
            }
        }
    }
    return 1;
}

void dfs(int row, int col)
{                         //当前行、列
    if(col > 8)
    {
        row++;
        col = 0;
    }
    if(row > 8)
    {
        find_answer_ok = 1;
        return ;
    }
    if(mp[row][col] == 0) 
    {
        for(int i = 1; i <= 9; i++)
        {
            if(check(row, col, i))
            {                      //check后满足
                mp[row][col] = i;
                dfs(row, col + 1);
                if(find_answer_ok)
                {                  //已经找到答案了,直接return
                    return ;
                }
                mp[row][col] = 0;  //没找到答案,回溯
            }
        }
    }
    else
    {
        dfs(row, col + 1);
    }
}

int main(void)
{
    for(int i = 0; i < 9; i++)
    {
        for(int j = 0; j < 9; j++)
        {
            scanf("%d",&mp[i][j]);
        }
    }
  
    dfs(0, 0);//起点坐标(0,0)

    for(int i = 0; i < 9; i++)
    {
        for(int j = 0; j < 9; j++)
        {
            printf("%d ",mp[i][j]);
        }
        printf("\n");
    }
    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-04 18:02
好不容易拿到了字节Offer,鼠鼠做后端的,但家里人觉得可能被裁员不稳定,让鼠鼠去投国企,现在好纠结到底该咋选
文档传偷助手:该投就投吧,不过建议别放弃offer 拿到手里的才是最好的
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 16:22
点赞 评论 收藏
分享
一表renzha:手写数字识别就是一个作业而已
点赞 评论 收藏
分享
07-01 19:00
门头沟学院 Java
点赞 评论 收藏
分享
评论
11
2
分享

创作者周榜

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