美文网首页C++
C++解数独

C++解数独

作者: blackOak | 来源:发表于2017-12-22 20:55 被阅读0次

大概是把网上找到的代码稍微改了一下,记不清了= =

代码

#include <iostream>

using namespace std;

/* 构造完成标志 */
bool sign = false;

/* 创建数独矩阵 */
int num[9][9];

void Input();
void Output();
bool Check(int n, int key);
int  DFS(int n);

int main()
{
    cout << "请输入一个9*9的数独矩阵,数字用空格隔开,空位以0表示:" << endl;
    Input();
    DFS(0);
    Output();
}

/* 读入数独矩阵 */
void Input()
{
    for (int i = 0; i < 9; i++)
        for (int j = 0; j < 9; j++)
            cin >> num[i][j];
}

/* 输出数独矩阵 */
void Output()
{
    cout << endl;
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++)
        {
            cout << num[i][j] << " ";
            if (j % 3 == 2)
                cout << "   ";
        }
        cout << endl;
        if (i % 3 == 2)
            cout << endl;
    }
}

/* 判断key填入n时是否满足条件 */
bool Check(int n, int key)
{
    /* 判断n所在横列是否合法 */
    for (int i = 0; i < 9; i++)
    {
        /* j为n竖坐标 */
        int j = n / 9;
        if (num[j][i] == key) return false;
    }

    /* 判断n所在竖列是否合法 */
    for (int i = 0; i < 9; i++)
    {
        /* j为n横坐标 */
        int j = n % 9;
        if (num[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 (num[i][j] == key) return false;

    /* 全部合法,返回正确 */
    return true;
}

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

测试用例

1 0 3 0 0 0 5 0 9
0 0 2 1 0 9 4 0 0
0 0 0 7 0 4 0 0 0
3 0 0 5 0 2 0 0 6
0 6 0 0 0 0 0 5 0
7 0 0 8 0 3 0 0 4
0 0 0 4 0 1 0 0 0
0 0 9 2 0 5 8 0 0
8 0 4 0 0 0 1 0 7

相关文章

  • C++解数独

    大概是把网上找到的代码稍微改了一下,记不清了= = 代码 测试用例 1 0 3 0 0 0 5 0 90 0 2 ...

  • 解数独

    编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次...

  • 求解数独的C++实现

    求解数独的C++实现## 动机### 在做数独的时候,抱着好奇心想做一个数独求解的程序。当时我并没有接触多少算法,...

  • 解数独算法

    昨天在Ubuntu18.04上打开自带的数独游戏,宿舍几个人一起玩了很久,今天整理了一下玩的过程,研究出算法并写成...

  • 解数独(sudouku)

    C++实现 实例 “芬兰数学家因卡拉花费3个月设计出了世界上迄今难度最大的数独游戏,而且它只有一个答案。因卡拉说只...

  • kotlin解数独

    kotlin 解数独,“容易”、“初级”均已解开,“高级”尚未测试,“高级+”没解开 数独链接:https://w...

  • 自动解数独

    直接上代码

  • C++求解数独(舞蹈链)算法实例

    求解数独,包括了数独所有解和舞蹈链的源码文件,源码主要是数独求解(舞蹈链算法)由于回朔法易于理解,不做具体介绍(便...

  • 8个步骤教你用Python解数独!(内含源码)

    前言 利用Python来解数独~~~起因大概是:自己解数独实在是太费劲了!!! 代码效果展示 所需工具 pytho...

  • Python 解数独(Sudoku)

    闲来有了用python解数独的想法,但由于对复杂些的算法仍是一窍不通,最终算是用简单算法实现了出来。 相关简介: ...

网友评论

    本文标题:C++解数独

    本文链接:https://www.haomeiwen.com/subject/chwxgxtx.html