一、问题描述:
数独是一种源自瑞士,18世纪末在美国发展、并且在日本得以发扬光大的数字拼图。数独的整体页面是一个九宫格,其中每一宫又分为九个小格。只要在这已知的八十一格中给出一定的已知数字和解题条件,玩家自己开动脑筋运用推理,在其他的空格上分别填入数字1到9,使1到9每个数字在每一行、每一列和每一宫都只出现一次。因为在填充“每个数字都是唯一的”的空间中,游戏被称为数独。这种安排,数独游戏中的数字,可以充分的测试和培养观察和推理能力,并解决问题。很多专业人士认为数独是提升智力开动脑筋的最佳途径。
问题要求:设计算法生成不同难度的数独游戏
二:问题分析
计算机程序求解数独,一般采用回溯法,对于任意数独初盘,好的算法都可以在一秒内得到解。目前,非常有效的算法,是舞蹈链算法。它实际上也是一种回溯算法,巧妙地运用了双向十字链表的数据结构,用空间换取时间,将数独求解转化为一个精确覆盖问题,用C语言实现的算法,在普通的微机上,能够在0.1ms左右对任意标准数独进行求解。这里只涉及到数独的生成算法,求解方面不再过多赘述。
综合上面的数独问题的分析和规划,不难发现数独问题的约束条件:
(1)每个矩阵的数字范围仅限1—9;
- 每个数字在当前行不允许重复;
- 每个数字在当前列不允许重复;
(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){