数独生成算法问题

一、问题描述:

数独是一种源自瑞士,18世纪末在美国发展、并且在日本得以发扬光大的数字拼图。数独的整体页面是一个九宫格,其中每一宫又分为九个小格。只要在这已知的八十一格中给出一定的已知数字和解题条件,玩家自己开动脑筋运用推理,在其他的空格上分别填入数字1到9,使1到9每个数字在每一行、每一列和每一宫都只出现一次。因为在填充“每个数字都是唯一的”的空间中,游戏被称为数独。这种安排,数独游戏中的数字,可以充分的测试和培养观察和推理能力,并解决问题。很多专业人士认为数独是提升智力开动脑筋的最佳途径。

问题要求:设计算法生成不同难度的数独游戏

二:问题分析

计算机程序求解数独,一般采用回溯法,对于任意数独初盘,好的算法都可以在一秒内得到解。目前,非常有效的算法,是舞蹈链算法。它实际上也是一种回溯算法,巧妙地运用了双向十字链表的数据结构,用空间换取时间,将数独求解转化为一个精确覆盖问题,用C语言实现的算法,在普通的微机上,能够在0.1ms左右对任意标准数独进行求解。这里只涉及到数独的生成算法,求解方面不再过多赘述。

综合上面的数独问题的分析和规划,不难发现数独问题的约束条件:
       (1)每个矩阵的数字范围仅限1—9;

  1. 每个数字在当前行不允许重复;
  2. 每个数字在当前列不允许重复;

(4)每个数字在每一宫内不允许重复。

下面是代码:

#include <stdio.h>

#include <cstring>

#include <iostream>

#include <algorithm>

using namespace std;

int shudu[9][9], hole[9][9];

//打印数独

void ouput()

{

    for (int i = 0; i < 9; ++i)

    {

        for (int j = 0; j < 9; ++j)

        {

            cout << shudu[i][j] << " ";

        }

        cout << endl;

    }

}

// 初始化中间的九宫格

void shudu_1()

{

    int a[10] = {};//初始化数组

       int n = 0;

       while(n < 9){

         

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值