随机数独的生成的实验思路概述

本文介绍了随机生成数独的实验思路,包括数独的生成规则、深度优先算法的应用以及难度级别的划分。首先,通过初始化空白数独并随机填入数字,确保唯一解。然后,使用深度优先搜索算法求解基础数独。接着,通过挖洞法扣除一定数量的数字,检查扣除后数独的唯一性以划分难度。最后,验证了算法的正确性和效率,强调了算法在数独生成和分析中的实用性。
摘要由CSDN通过智能技术生成

数独起源于拉丁方阵,由单元格、行、列、宫等元素组成,规则是在每行、每列、每宫的九个单元格中填入数字1-9,不重复。给定一定数量提示数的盘面作为初始条件,称为初盘。根据规则将所有单元格填满得到的盘面称为终盘,也就是数独的解。标准的数独初盘只能对应一个终盘。

一般采用随机方式生成数独,即从空白的数独盘面开始随机填数,填入的数字不能违背数独的基本规则,并且要保证解的唯一性。在随机填入过程中,判断某个位置是否可以填入一个随机的数是根据这一位置所处行列宫区域中是否已有此数来决定。当填入这一数之后,修改它所处区域的标记信息。当填入的数字达到一定量之后,再进行数独求解。

数独的求解常用的生成方法有挖洞法,即挖去一个数独终盘上某些位置上的数,使其形成的局面只有一个解,即做为数独初盘。初始的数独终盘,可根据一定的算法生成,也可以根据某个已知的终盘,进行若干次行列互换或数字的交换等方法得到。

实验需要我们通过设计算法来输出不同难度的数独题目和答案。

其中数独生成的规则为:根据9X9表盘上面的已知数字,推理出所有剩余空格的数字,并且需满足每一行、每一列、每个九宫格内的数字均含1-9,不重复。数独的难度通过对数独终盘挖掉数字的个数多少来划分。

①构造数独规则:先初始化数独空白表格,在空白数独中随机选择要求个空白单元格,筛选出该单元格满足条件的数字并填入。

②深度优先算法:定义深度优先算法。

③基础数独生成:使用深度优先算法对已经部分填入的数独进行遍历求解,输出基本数独。

④实现难度划分:在已经求解完毕的基本数独上随机选取单元格,假设扣除该单元格的数字并检验扣除后数独的唯一性,直至成功扣除指定个数的单元格,生成对应难度的数独题目。再次使用深度优先算法对扣除指定个数单元格的数独题进行遍历求解,并输出对应的数独答案。

①定义类Sudoku

class Sudoku:
   
def __init__(self):
       
# 初始化九宫格
        self.grids= np.zeros((9, 9), dtype=int, order='C')
       
self.possibleNums= { 1, 2, 3, 4, 5, 6, 7, 8, 9}
       
# 用于挖洞时保存挖好的数独
        self.uniqueGrids = None

②使用Python,导入Numpy库,使用矩阵来保存和处理数独数据。使用zeros方法生成9X9的的0矩阵,初始化数独。导入Random库的randint方法来生成随机的行标和列标用来随机定位一个单元格。

③定义函数get_possible用行、列、九宫格不可重复的规则筛选出指定单元格满足条件的所有取值并存储在集合中。

# 由三个约束条件剔除数据

def get_possible(self, row, col):

    bRow, bCol = row // 3, col // 3

    # 提取行标为row的行

    rowSet = set(self.grids[row])

    # 提取列标为col的列

    colSet = set(self.grids[:,col])

    # 由行标列表取出所在的3*3小九宫格

    blockSet = set(self.grids[bRow * 3: bRow * 3 + 3,

                   bCol * 3: bCol * 3 + 3].reshape(9))

    # 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值