【教学类-43-02】20231226 九宫格数独2.0(n=9)(ChatGPT AI对话大师生成 回溯算法)

news2025/1/23 15:01:24

作品展示:

背景需求:

大4班20号说:我不会做这种(九宫格),我做的是小格子的,

他把手工纸翻过来,在反面自己画了矩阵格子。向我展示:

“我会做这种!”

原来他会的是3宫格、5宫格数独行列5个数字)

“好的,下次老师准备 5宫格的数独题”

设计思考

【教学类-43-01】20231226 九宫格数独1.0-CSDN博客文章浏览阅读386次,点赞6次,收藏7次。【教学类-43-01】20231226 九宫格数独1.0https://blog.csdn.net/reasonsummer/article/details/135231228

那么怎么写5宫格数独呢?原来的9宫格代码是抄的,用了DEF函数,我没有看懂。

————————————————
# 版权声明:本文为CSDN博主「Vaeeeeeee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# 原文链接:https://blog.csdn.net/m0_46366547/article/details/131334720
    def generate_sudoku_board():
        # 创建一个9x9的二维列表,表示数独棋盘
        board = [[0] * 9 for _ in range(9)]
 
        # 递归函数,用于填充数独棋盘的每个单元格
        def filling_board(row, col):
            # 检查是否填充完成整个数独棋盘
            if row == 9:
                return True
            
            # 计算下一个单元格的行和列索引
            next_row = row if col < 8 else row + 1
            next_col = (col + 1) % 9
 
            # 获取当前单元格在小九宫格中的索引
            box_row = row // 3
            box_col = col // 3
 
            # 随机生成1到9的数字
            numbers = random.sample(range(1, 10), 9)
 
            for num in numbers:
                # 检查行、列、小九宫格是否已经存在相同的数字
                if num not in board[row] and all(board[i][col] != num for i in range(9)) and all(num != board[i][j] for i in range(box_row*3, box_row*3+3) for j in range(box_col*3, box_col*3+3)):
                    board[row][col] = num
 
                    # 递归填充下一个单元格
                    if filling_board(next_row, next_col):
                        return True
 
                    # 回溯,将当前单元格重置为0
                    board[row][col] = 0
 
            return False
 
        # 填充数独棋盘
        filling_board(0, 0)
        return board
        
    def create_board(level): # level数字越大代表游戏难度越大
            """
            生成一个随机的数独棋盘,空白格少
            """
            board = generate_sudoku_board()
            board1 =  copy.deepcopy(board)
            for i in range(81):
                row = i // 9
                col = i % 9
                if random.randint(0, 9) < level:
                    board1[row][col] = 0
            return (board,board1)
 
    v = create_board(5)[1]  
    print(v)
 
# # >>>
# # [[1, 0, 0, 8, 0, 6, 0, 0, 4],
# #  [5, 0, 0, 0, 0, 0, 0, 0, 0],
# #  [0, 6, 0, 7, 0, 2, 0, 0, 1],
# #  [2, 0, 0, 3, 7, 9, 0, 0, 0],
# #  [7, 0, 0, 6, 8, 0, 0, 3, 2],
# #  [0, 0, 5, 4, 0, 0, 7, 6, 9],
# #  [6, 0, 7, 0, 0, 8, 9, 4, 0],
# #  [3, 0, 1, 0, 4, 0, 0, 0, 0],
# #  [9, 0, 4, 5, 6, 0, 0, 2, 7]]

————————————————
版权声明:本文为CSDN博主「阿夏reasonsummer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/reasonsummer/article/details/135231228

1、研究5个数字的组合数量

我决定从最简答的1-5数字排列开始研究,

先在网络搜索,第一个跳出来的就是chatgpt写代码

突然想起“FB培训"时,老师介绍用AI对话大师,让它写Python代码“石头剪刀布”。于是我打开“AI对话大师”就问它“1-5有几种排列方法,Python”

它真的写出来了,最简单的permutations

好不容易写好了1-5的120种排列方法,然后我发现横向的5个有了,但是纵向的怎么选择选择,又难住了。二、再问chatGPT——“五宫格数独Python”

VScode

新的代码和原来的一样,我发现它是用来解答已有的数独题的答案,而不是用来生成数独题目的。

所以换了一种问题:

Python设计一个九宫格数独程序,有一半空格

VS code 果然生成了不同的9宫格样式

AI对话大师设计的九宫格数独9*9

代码展示

'''
目的:九宫格数独2.0参考AI对话大师提示的代码(15正方形手工纸)
作者:阿夏(参考)
时间:2023年12月26日 20:35
'''

import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time

import docx
from docx import Document
from docx.shared import Pt 
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn


from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor

# 第一步:生成所9*9数独

# 新建一个”装N份word和PDF“的临时文件夹
imagePath1=r'C:\Users\jg2yXRZ\OneDrive\桌面\数独\零时Word'
if not os.path.exists(imagePath1):  # 判断存放图片的文件夹是否存在
    os.makedirs(imagePath1)  # 若图片文件夹不存在就创建


# 生成题库
import random
import copy

num=int(input('生成几份\n'))
for z in range(num):


            
        
        


    def is_valid(board, num, row, col):
        # 检查行是否有重复数字
        for i in range(9):
            if board[row][i] == num:
                return False

        # 检查列是否有重复数字
        for i in range(9):
            if board[i][col] == num:
                return False

        # 检查所在的小方格是否有重复数字
        start_row = (row // 3) * 3
        start_col = (col // 3) * 3
        for i in range(3):
            for j in range(3):
                if board[start_row + i][start_col + j] == num:
                    return False

        return True

    def solve_sudoku(board):
        for row in range(9):
            for col in range(9):
                if board[row][col] == 0:
                    for num in range(1, 10):
                        if is_valid(board, num, row, col):
                            board[row][col] = num
                            if solve_sudoku(board):
                                return True
                            board[row][col] = 0
                    return False
        return True

    def generate_sudoku():
        board = [[0] * 9 for _ in range(9)]
        solve_sudoku(board)

        # 随机选择一半格子作为空白格
        blanks = random.sample(range(81), 40)
        for i in blanks:
            row = i // 9
            col = i % 9
            board[row][col] = 0

        return board

    def print_sudoku(board):
        for row in range(9):
            for col in range(9):
                print(board[row][col], end=" ")
            print()

    # 生成一个有一半空格的数独
    sudoku = generate_sudoku()

    print("生成的数独:")
    print_sudoku(sudoku)

    P=[]
    # 做成列表样式
    for sd in sudoku:
        print(sd)
        for sd2 in sd:
            if sd2==0:                # 如果某个元素==0,就替换成空格
                P.append('')
            else:      # 如果某个元素非0,就写入本身的数字
                P.append(sd2)
            # print(sd2)
          
    print(len(P))

     
        
    
#     v = create_board(5)[1]  
#     print(v)

# # # >>>
# # [[1, 0, 0, 8, 0, 6, 0, 0, 4],
# #  [5, 0, 0, 0, 0, 0, 0, 0, 0],
# #  [0, 6, 0, 7, 0, 2, 0, 0, 1],
# #  [2, 0, 0, 3, 7, 9, 0, 0, 0],
# #  [7, 0, 0, 6, 8, 0, 0, 3, 2],
# #  [0, 0, 5, 4, 0, 0, 7, 6, 9],
# #  [6, 0, 7, 0, 0, 8, 9, 4, 0],
# #  [3, 0, 1, 0, 4, 0, 0, 0, 0],
# #  [9, 0, 4, 5, 6, 0, 0, 2, 7]]
    
  
    # 第二步 读取word单元格写入


        # 新建word
    doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\数独\数独正方形.docx')  
    for j in range(1):

        
        # 制作"单元格"
        bg=[]
        for x in range(0,9):       # 5   #数列 先宽 后高  
            for y in range(0,9):      #    23
                s1='{}{}'.format('%02d'%x,'%02d'%y)       #数列 先y 后x  
                bg.append(s1)   
        print(bg)        
        print(len(bg))

#       # 房间模板(第一个表格)要写入的门牌号列表 
        table = doc.tables[j]          # 表0,表2 写标题用的
        # 标题写入3、5单元格  
        for t in range(0,len(bg)):             # 0-5是最下面一行,用来写卡片数字
            pp=int(bg[t][0:2])     # 
            qq=int(bg[t][2:4])
            k=str(P[t])              # 提取list图案列表里面每个图形  t=索引数字
            print(pp,qq,k)

            # 图案符号的字体、大小参数
            run=table.cell(pp,qq).paragraphs[0].add_run(k)    # 在单元格0,0(第1行第1列)输入第0个图图案
            run.font.name = '黑体'#输入时默认华文彩云字体
            # run.font.size = Pt(46)  #输入字体大小默认30号 换行(一页一份大卡片
            run.font.size = Pt(24) #是否加粗
            # run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255
            run.font.color.rgb = RGBColor(50,50,50) #数字小,颜色深0-255
            run.bold=True
            # paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距
        
            r = run._element
            r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
            table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#居中  

    
#       
# #    
    doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\数独\零时Word\{}.docx'.format('%02d'%(z+1)))#保存为XX学号的电话号码word     
    time.sleep(2)
    from docx2pdf import convert
    # docx 文件另存为PDF文件
    inputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/数独/零时Word/{}.docx".format('%02d'%(z+1))# 要转换的文件:已存在
    outputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/数独/零时Word/{}.pdf".format('%02d'%(z+1))  # 要生成的文件:不存在
    # 先创建 不存在的 文件
    f1 = open(outputFile, 'w')
    f1.close()
    # 再转换往PDF中写入内容
    convert(inputFile, outputFile)
    
print('----------第4步:把都有PDF合并为一个打印用PDF------------')
    
# 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
import os
from PyPDF2 import PdfMerger
target_path =  'C:/Users/jg2yXRZ/OneDrive/桌面/数独/零时Word'
pdf_lst = [f for f in os.listdir(target_path) if f.endswith('.pdf')]
pdf_lst = [os.path.join(target_path, filename) for filename in pdf_lst]
pdf_lst.sort()
file_merger = PdfMerger()
for pdf in pdf_lst:
    print(pdf)
    file_merger.append(pdf)

file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/数独/(打印合集)05正方形数独2.0 9乘9({}人{}份).pdf" .format(num,num))

file_merger.close()
# doc.Close()

# # print('----------第5步:删除临时文件夹------------')    
import shutil
shutil.rmtree('C:/Users/jg2yXRZ/OneDrive/桌面/数独/零时Word') #递归删除文件夹,即:删除非空文件夹





        
        

去0后,样式

感悟;

第一次用chatGPT写Python代码,成效斐然

用这个9宫格样式,再研究6宫格,4宫格,5宫格等其他样式。提供简单一些的幼儿数独推理题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1344018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据采集遇到验证码校验的一般破解方式简述

背景 百度自动采集是一种高效的数据采集方法&#xff0c;但是在采集过程中经常会遇到图片验证码的问题&#xff0c;从而导致采集失败。那么有没有什么方法可以绕过图片验证呢&#xff1f;本文将为您详细介绍。 解决方案 一、使用OCR技术识别验证码 OCR技术可以识别图片中的…

JS 遍历本月所有日期

代码如下&#xff1a; function getMonthAllDays() {// 获取当前日期var currentDate new Date(); // 获取当前月份的第一天var firstDayOfMonth new Date(currentDate.getFullYear(), currentDate.getMonth(), 1); // 获取当前月份的最后一天var lastDayOfM…

Python将普通图像转化为栅格影像

引言 本人研究的方向是遥感&#xff0c;研究了2年也搞没清楚普通图像和遥感影像的区别&#xff0c;只知道到了多了地理坐标信息&#xff0c;但是经纬度信息映射到每个图像像素点的底层逻辑我还不太理解。因为现在需要使用python将图像转化为栅格影像&#xff0c;所以在此仔细研…

超维空间S2无人机使用说明书——51、基础版——使用yolov8进行目标跟踪

引言&#xff1a;为了提高yolo识别的质量&#xff0c;提高了yolo的版本&#xff0c;改用yolov8进行物体识别&#xff0c;同时系统兼容了低版本的yolo&#xff0c;包括基于C的yolov3和yolov4&#xff0c;以及yolov7。 简介&#xff0c;为了提高识别速度&#xff0c;系统采用了G…

解决VNC连接Ubuntu服务器打开终端出现闪退情况

服务器环境 阿里云ECS服务器 操作系统&#xff1a;Ubuntu 20.0.4 如何使用VNC连接阿里云ECS服务器 1.阿里云官方指导&#xff1a;通过VNC搭建Ubuntu 18.04和20.04图形界面 2.新手入门ECS——ubuntu 20.04安装图形化界面和本地VNC连接 问题描述 使用VNC连接上新申请阿里云服…

Python 实现 PDF 到 Word 文档的高效转换(DOC、DOCX)

PDF&#xff08;Portable Document Format&#xff09;已成为一种广泛使用的电子文档格式。PDF的主要优势是跨平台&#xff0c;可以在不同设备上呈现一致的外观。然而&#xff0c;当我们需要对文件内容进行编辑或修改&#xff0c;直接编辑PDF文件会非常困难&#xff0c;而且效果…

分布式技术之分布式数据存储系统

文章目录 什么是分布式数据存储系统&#xff1f;分布式数据存储系统三要素顾客&#xff1a;生产和消费数据导购&#xff1a;确定数据位置货架&#xff1a;存储数据 CAP 理论指出&#xff0c;在分布式系统中&#xff0c;不能同时满足一致性、可用性和分区容错性&#xff0c;指导…

408计算机组成原理错题知识点拾遗

个人向错题相关部分整理&#xff0c;涵盖真题、模拟、课后习题等。 408相关&#xff1a; 408数据结构错题知识点拾遗 408数据结构常考算法基础训练等待完善 408计算机组成原理错题知识点拾遗408操作系统错题知识点拾遗等待完善408计算机网络错题知识点拾遗 408计算机网络各层协…

MYSQL的UPDATE时锁表机制

&#xff08;笔记&#xff0c;只为获取流量券&#xff09; MySQL中&#xff0c;UPDATE 操作涉及到行级锁和表级锁的概念&#xff0c;具体取决于事务隔离级别和被更新的条件, 无索引的情况下&#xff1a; 当表没有索引的情况下&#xff0c;UPDATE 操作通常会涉及到表级锁。这是…

使用Halcon 采集图像并进行简单处理rgbl_to_gray/threshold/connection/fill_up

使用Halcon 采集图像并进行简单处理 文章目录 使用Halcon 采集图像并进行简单处理 下面介绍一个简单的采集图像的例子。在Halcon中利用图像采集接口&#xff0c;使用USB3.0相机实时拍摄图像。采集到图像后对图像进行简单的阀值分割处理&#xff0c;将有物体的区域标记出来。 &a…

------- 计算机网络基础

1.1概述 是什么? 答出独立计算机通信线路连接实现资源共享 计算机网络组成 从组成部分看: 硬件软件协议 从工作方式看: 边缘部分和核心部分 从功能组成看: 通信子网和资源子网 计算机网络性能指标 速率是指数据传输的物理速度&#xff0c;吞吐量是指实际的数据传输…

iPhone 13 Pro 更换『移植电芯』和『超容电池』体验

文章目录 考虑换电池Ⅰ 方案一Ⅱ 方案二 总结危险 Note系列地址 简 述: 首发买的iPhone 13P &#xff08;2021.09&#xff09;&#xff0c;随性使用一年出头&#xff0c;容量就暴跌 85%&#xff0c;对比朋友一起买的同款&#xff0c;还是95%。这已经基本得一天两充 >_<&a…

【机组期末速成】指令系统|机器指令概述|操作数类型与操作类型|寻址方式|指令格式

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;计算机组成原理&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 前言&#xff1a; 一、本章考点总览 二、考点分析 1、以下有关指令系统的说法中错误的是&#xff08; &#xff09;。 2…

使用LOTR合并检索提高RAG性能

RAG结合了两个关键元素:检索和生成。它首先使用语义搜索等高级技术来浏览大量数据&#xff0c;包括文本、图像、音频和视频。RAG的本质在于它能够检索相关信息&#xff0c;然后作为下一阶段的基础。生成组件利用大型语言模型的能力&#xff0c;解释这些数据块&#xff0c;制作连…

操作系统大题

目录 作业一&#xff1a; 前驱图 作业二&#xff1a;信号量 作业三&#xff1a;同步算法 1‘’生产者消费者问题 解1&#xff1a; 解2&#xff1a;利用AND信号量解决生产者-消费者问题 解3. 利用管程解决生产者-消费者问题 2‘’ 哲学家进餐问题&#xff08;The Dinning…

Conda:Python环境管理的瑞士军刀

在数据科学和机器学习的世界中&#xff0c;管理各种库和依赖关系的重要性不容忽视。Conda 就是为此而生的强大工具。本文将深入探讨 Conda 的简介、功能以及使用示例&#xff0c;帮助你更好地理解和使用这个工具。 Conda 简介 Conda 是一个开源的包管理系统和环境管理系统&am…

MPLS动态协议LDP配置示例

一、预习&#xff1a; MPLS是一种根据报文中携带的标签来转发数据的技术&#xff0c;两台LSR必须在它们之间转的数据 的标签使用上“达成共识”。LSR之间可以运行LDP来告知其他LSR本设备上的标签绑定信息&#xff0c;从而实现标签报文的正确转发。 LSR&#xff1a;Label Switch…

跨进程通信 macOS XPC 创建实例

一&#xff1a;简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单&#xff0c;但是比较绕。 主要需要集成 XPC Server 这个模块&#xff0c;这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭&#xff0c; 我们主app 进…

网络运行状况监控工具

网络运行状况是网络在其操作和环境约束范围内按预期运行的能力&#xff0c;但是&#xff0c;随着云和人工智能等技术的出现&#xff0c;网络变得越来越复杂&#xff0c;维护其 IT 基础设施是一项越来越繁琐的任务。为了确保网络可靠性&#xff0c;组织需要了解每个端点的运行状…

【c/c++】指针例图基础详解

文章目录 指针变量内存指针详解例1例2练习&答案解析 指针变量内存 int main(){// 各类型变量占字节数printf("char: %d\n",sizeof(char)); // 1printf("short: %d\n",sizeof(short)); // 2printf("int: %d\n",sizeof(int)); // 4pri…