LeetCode 37 解数独

本文介绍了一个基于深度优先搜索(DFS)的数独求解算法,该算法能够在给定部分填写的数独网格中找到唯一解。通过递归地尝试每个可能的数字并检查其是否满足数独规则,最终输出完整的数独解决方案。

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

LeetCode 37 解数独

**

题目:

编写一个程序,通过已填充的空格来解决数独问题。

一个数独的解法需遵循如下规则:

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
在这里插入图片描述
一个数独。
在这里插入图片描述
答案被标成红色。

Note:
给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
**
开发环境:Vs Code

源代码:

#include<iostream>

using namespace std;

//全局变量
bool sign = false;

//全局变量 定义一个数独 二维数组
//其中0代表空
int map[9][9] = {
    {5, 3, 0, 0, 7, 0, 0, 0, 0},
    {6, 0, 0, 1, 9, 5, 0, 0, 0},
    {0, 9, 8, 0, 0, 0, 0, 6, 0},
    {8, 0, 0, 0, 6, 0, 0, 0, 3},
    {4, 0, 0, 8, 0, 3, 0, 0, 1},
    {7, 0, 0, 0, 2, 0, 0, 0, 6},
    {0, 6, 0, 0, 0, 0, 2, 8, 0},
    {0, 0, 0, 4, 1, 9, 0, 0, 5},
    {0, 0, 0, 0, 8, 0, 0, 7, 9},
};

//输出数独函数的声明
void show();

//深度搜索函数的声明
int search(int n);

//判断key填入n时是否满足条件 函数的声明
bool Check(int n, int key);

int main(){
    search(0);
    show();
    system("pause");
    return 0;
}

//输出数独函数的实现
void show()
{
    for (int i = 0; i < 9; i++){
        for (int j = 0; j < 9; j++){
            cout << map[i][j] << " " ;
        }
        cout << endl;
    }
}

//深度搜索函数的实现
int search(int n)
{
    //所有的都符合,退出递归   
    if (n > 80)   
    {    
        sign = true;      
        return 0;   
    }   
    //当前位不为空时跳过 
    if (map[n/9][n%9] != 0)   
    {  
        search(n+1);  
    }  
    else{     
        //否则对当前位进行枚举测试 
        for (int i = 1; i <= 9; i++)      
        {          
            //满足条件时填入数字          
            if (Check(n, i) == true)         
            {             
                map[n/9][n%9] = i;      
                //继续搜索 
                search(n+1);       
                //返回时如果构造成功,则直接退出
                if (sign == true) return 0;       
                //如果构造不成功,还原当前位
                map[n/9][n%9] = 0;        
            }       
        } 
    }
}

//判断key填入n时是否满足条件 函数的声明
bool Check(int n, int key)
{
    //判断n所在横列是否合法 
    for (int i = 0; i < 9; i++)   
    {      
        //j为n竖坐标      
        int j = n / 9;     
        if (map[j][i] == key) 
            return false;  
    }
    //判断n所在竖列是否合法
    for (int i = 0; i < 9; i++)   
    {       
        //j为n横坐标   
        int j = n % 9;     
        if (map[i][j] == key)
            return false;   
    }     
    //x为n所在的小九宫格左顶点竖坐标
    int x = n / 9 / 3 * 3;    
    //y为n所在的小九宫格左顶点横坐标  
    int y = n % 9 / 3 * 3;    
    //判断n所在的小九宫格是否合法  
    for (int i = x; i < x + 3; i++)   
    {       
        for (int j = y; j < y + 3; j++)    
        {          
            if (map[i][j] == key)
                return false;      
        }   
    }   
    //全部合法,返回正确  
    return true;
}

参考自:https://blog.youkuaiyun.com/qq_31558353/article/details/50615760

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值