目录

【题目】列出如下数独问题的2种数学模型,分析两种模型的优缺点,并用Excel求解,将结果填上。这里用Python进行求解:

一、代码 model1

二、代码 model2

三、求解结果


【题目】列出如下数独问题的2种数学模型,分析两种模型的优缺点,并用Excel求解,将结果填上。这里用Python进行求解:

一、代码 model1 :


""" 数独是 9 横 9 竖共有 81 个格子,同时又分为 9 个九宫格。我们填写数独的顺序是将 9 个九宫格按照从左到右,从上到下的顺序排列,再将每个九宫格内部的空白格按照从左到右,从上到下的顺序排列,依次按照顺序填写空白格。"""""" 解此种数独用达不到默认递归的深度
import sys
sys.setrecursionlimit(100000) # 发现python默认的递归深度是很有限的#(默认是1000),因此当递归深度超过999的# 样子,就会引发这样的一个异常。
"""import numpy as np
import timetime1 = time.time()def get_next(m :"数独矩阵", x :"空白格行数", y :"空白格列数"):""" 功能:获得下一个空白格在数独中的坐标。       """for next_y in range( y +1, 4):  # 下一个空白格和当前格在一行的情况if m[x][next_y] == 0:return x, next_yfor next_x in range( x +1, 4):  # 下一个空白格和当前格不在一行的情况for next_y in range(0, 4):if m[next_x][next_y] == 0:return next_x, next_yreturn -1, -1               # 若不存在下一个空白格,则返回 -1,-1def value(m :"数独矩阵", x :"空白格行数", y :"空白格列数"):""" 功能:返回符合"每个横排和竖列以及九宫格内无相同数字"这个条件的有效值。"""i, j = x// 2, y // 2grid = [m[i * 2 + r][j * 2 + c] for r in range(2) for c in range(2)]v = set([x for x in range(1, 5)]) - set(grid) - set(m[x]) - \set(list(zip(*m))[y])return vdef start_pos(m: "数独矩阵"):""" 功能:返回第一个空白格的位置坐标"""for x in range(4):for y in range(4):if m[x][y] == 0:return x, yreturn -1, -1  # 若数独已完成,则返回 -1, -1def try_sudoku(m: "数独矩阵", x: "空白格行数", y: "空白格列数"):""" 功能:试着填写数独 """for v in value(m, x, y):if m[x][y] == 0:  # 判断是否为空格m[x][y] = vnext_x, next_y = get_next(m, x, y)if next_y == -1:  # 如果无下一个空白格data = np.array(m, dtype=int).reshape((4, 4))print(data)return Trueelse:end = try_sudoku(m, next_x, next_y)  # 递归if end:return Truem[x][y] = 0  # 在递归的过程中,如果数独没有解开,# 则回溯到上一个空白格    def sudoku(m):x, y = start_pos(m)""" 解数独的一个结果try_sudoku(m, x, y)"""# 解数独的所有结果for v in value(m, x, y):m[x][y] = vnext_x, next_y = get_next(m, x, y)try_sudoku(m, next_x, next_y)if __name__ == "__main__":m = [[0, 1, 0, 0],[4, 0, 0, 0],[0, 0, 0, 2],[3, 0, 0, 0]]sudoku(m)tiem2 = time.time()print('\nFinished! model1 using time:', tiem2 - time1, 's')

二、代码 model2:

import numpy as np
import timetime1 = time.time()
'''整体灵感就是1 求出每个数字为0的位置可以填的数,并将其位置和能填的数分别以key和value的方式存储到字典里面2 将字典里的数据按照所能填写的数据的多少进行排序,先在能填的数少的里面选取一个进行填写3 将填写的过程记录到列表里面,这个地方暂时想到的就是用列表记录填写过程4 更新1、2步,若出现某一步可填写的数据为空,说明之前某一步的选择有问题,回溯回去,更换数值,然后回到步骤15 当所有的数都填完后,退出循环
'''def nine(data):nine_block = np.zeros([2, 2, 2, 2], dtype=int)print('nine_block:',nine_block)for i in range(2):for j in range(2):nine_block[i, j] = data[2 * i:2 * (i + 1), 2 * j:2 * (j + 1)]return nine_blockdef num_set(data, nine_block):pick_set = {}for i in range(4):for j in range(4):if data[i, j] == 0:pick_set[str(i) + str(j)] = set(np.array(range(5))) - \(set(data[i, :]) | set(data[:, j]) | \set(nine_block[i // 2, j // 2].ravel()))return pick_setdef try_insert(data):insert_step = []while True:pick_set = num_set(data, nine(data))if len(pick_set) == 0: breakpick_sort = sorted(pick_set.items(), key=lambda x: len(x[1]))item_min = pick_sort[0]key = item_min[0]value = list(item_min[1])insert_step.append((key, value))if len(value) != 0:data[int(key[0]), int(key[1])] = value[0]else:insert_step.pop()for i in range(len(insert_step)):huishuo = insert_step.pop()key = huishuo[0]insert_num = huishuo[1]if len(insert_num) == 1:data[int(key[0]), int(key[1])] = 0else:data[int(key[0]), int(key[1])] = insert_num[1]insert_step.append((key, insert_num[1:]))breaktiem2 = time.time()print('\nFinished! model2 using time:', tiem2 - time1, 's')print(data)if __name__ == '__main__':data = "0 1 0 0  \4 0 0 0 \0 0 0 2 \3 0 0 0  "data = np.array(data.split(), dtype=int).reshape((4, 4))print(data)try_insert(data)

三、求解结果

参考:

用 Python 解数独(Sudoku)

利用python,求解数独

【Numpy】用Python求解数独相关推荐

  1. python图像数独_Python图像识别+KNN求解数独的实现

    Python-opencv+KNN求解数独 最近一直在玩数独,突发奇想实现图像识别求解数独,输入到输出平均需要0.5s. 整体思路大概就是识别出图中数字生成list,然后求解. 输入输出demo 数独 ...

  2. 利用python,求解数独

    import numpy as np import time time1 = time.time() '''整体灵感就是1 求出每个数字为0的位置可以填的数,并将其位置和能填的数分别以key和valu ...

  3. python 物理学中的应用_利用python求解物理学中的双弹簧质能系统详解

    前言 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的模型如下: 在这个系统里有两个物体,它们的质 ...

  4. 从numpy开启Python数据科学之旅

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目前小编的Python学习是按照两个路径在一路往下推,希望借此改变 ...

  5. python怎么安装numpy库-python怎么安装numpy库

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. Python官网上的发行版是不包含Num ...

  6. python代码物理_利用python求解物理学中的双弹簧质能系统详解

    前言 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的模型如下: 在这个系统里有两个物体,它们的质 ...

  7. 使用Python编写数独游戏自动出题程序

    数独是一个很好玩的游戏,可以锻炼推理能力.下面的代码可以自动生成数独游戏题目. from random import shuffle, randrange def generate():     # ...

  8. 用Python求解线性规划问题

    线性规划简介及数学模型表示线性规划简介一个典型的线性规划问题线性规划模型的三要素线性规划模型的数学表示图解法和单纯形法图解法单纯形法使用python求解简单线性规划模型编程思路求解案例例1:使用sci ...

  9. 人工智能 --- Python求解线性和非线性规划问题

    基于jupyter notebook的Python编程 一.线性规划问题求解 1.Excel中大M法与Excel的"规划求解"包对实际问题的求解比较 实际例题: 求解以下约束条件的 ...

最新文章

  1. BugBash活动分享
  2. 聊聊高并发系统之队列术
  3. 常微分方程数值解:欧拉公式
  4. boost::detail::lightweight_mutex相关的测试程序
  5. coach和mentor,教练和导师的区别
  6. 平衡的阵容(洛谷-P2880)
  7. 学习SpringBoot(1)入门及简单的配置
  8. HDU 4825 (01字典树)
  9. 嵌入式软件开发面试——一个应届生求职的亲身经历
  10. 开关电源共模电感和X电容的选取?
  11. php memcache内存大小,PHP memcache 内存缓存 数据库查询 应用 高洛峰 细说PHP
  12. SAPGUI 里 F1 功能键的用法专题讲解试读版
  13. 学习记录:安装binwalk
  14. 安卓开发app版本更新
  15. 前端vue接口渲染到模板报错解决方案
  16. C语言循环计算输出圆周长
  17. Shopify好用的开发插件/网站编辑插件
  18. B2B2C商城系统 -多端+多店+社交+新零售网上商城开发
  19. 刘大拿python_零基础Python知识点回顾(一)
  20. 浙江大学 计算机学院 秦青青,军训倒计时 | 说给辅导员听的“悄悄话”

热门文章

  1. ArkID 一账通:企业级开源IDaaS/IAM平台系统
  2. 各代iphone ipad iPod各种信息 获取设备型号等等整理
  3. 越狱Season 1-Episode 1: the pilot
  4. double型10进制转二进制
  5. web service在java_java web Service的使用
  6. 红米k30s至尊纪念版参数配置
  7. 年前找工作好,还是年后找工作好?求职需警惕,小心陷入羊群效应
  8. 【Angular4】constructor ngOnInit
  9. 性能测试瓶颈分析与系统调优(1)项目部署与测试环境工具安装
  10. NodeJS - 第一个应用程序Hello World