【教学类-43-14】20240103(4宫格数独:正确版:576套)不重复的基础模板数量:576套
- 创业
- 2025-07-21 18:56:23

作品展示::——4宫格 576套不重复模板(48页*12套题) 背景需求:
生成4宫格基础模板768套,观看64页内容时,明显看到有错误
【教学类-43-13】 20240103 (4宫格数独:错误版:768套) 不重复的基础模板数量:768套-CSDN博客文章浏览阅读95次,点赞3次,收藏3次。【教学类-43-13】 20240103 (4宫格数独:错误版:768套) 不重复的基础模板数量:768套 blog.csdn.net/reasonsummer/article/details/135372063
解决思路 最终发现纵向4格不能直接用三个不等于进行通用——第0格数字不等于第4格数字不等于第8格数字不等于第12个数字、 修改成一个对应一个进行不等于, 第0格数字与第4格数字不相等, 第0格数字与第8格数字不相等, 第0格数字与第12格数字不相等, 第4格数字与第8格数字不相等, 第4格数字与第12格数字不相等, 第8格数字与第12格数字不相等, 原理不清楚,反正最后结果数字从786降低到576.应该是排除掉一部分错误的题型。 上代码: # 测试11*11格,2*2一共4套3*3 宫格 ''' 目的:数独14 4宫格有300套不同的基础模板 作者:阿夏 时间:2024年01月03日 13: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 # 生成题库 import random import math from itertools import permutations # num=int(input('生成几份\n')) # 制作"单元格"# 几宫格 hsall=4 # int(input('3宫格数独=3\n')) hs=hsall # kk=int(input('空格数量,输入5,就是50%,就是空一半)\n')) print('------第1步:制作单元格-------') ll=['3','4','5','6','7','8','9'] # 如果输入345 mm=['43','43','32','32','32','32','32']# 3对应的套数是4*3套 nn=['36','24','36','24','24','24','24']# 3对应的写入单元格的数字大小36磅 for r in range(len(ll)): if hsall ==int(ll[r]): # 底边几套.底边看有2份 db=int(mm[r][0]) # int(input('底边几套? 3\n')) # 侧边几套 侧边看也是2份 print(db ) cb=int(mm[r][1]) # int(input('侧边几套? 2\n')) print(cb) size=int(nn[r]) print(size) # 写入单元格数字的大小(撑满格子) # 新建一个”装N份word和PDF“的临时文件夹 imagePath1=r'C:\Users\jg2yXRZ\OneDrive\桌面\数独\零时Word' if not os.path.exists(imagePath1): # 判断存放图片的文件夹是否存在 os.makedirs(imagePath1) # 若图片文件夹不存在就创建 # 计算不同模板中的单元格坐标,放在bg里 # 棋盘格子数量, # 如果正方形:底边2*侧边2,就是3*3宫格 2*2=4套,底边边格子数量就是3*2+1=7,侧边格子数量就是3*2+1=7, # 如果长方形:底边3*侧边2,就是3*3宫格,3*2=6套 底边格子数量就是3*3+2=11,侧边格子数量就是3*2+1=7, # if db==cb: db_size = hs*db+db-1 cb_size= hs*cb+cb-1 print('{}宫格排列底{}侧{}共{}套,底边格子数{}'.format(hs,db,cb,db*cb,db_size )) print('{}宫格排列底{}侧{}共{}套,侧边格子数{}'.format(hs,db,cb,db*cb,cb_size )) # 确定每个宫格的左上角坐标 00 04 40 44 bgszm=[] for a in range(0,cb_size,hs+1): # 0-11每隔4,写一个坐标 侧边y for b in range(0,db_size,hs+1): # 0-11每隔4,写一个坐标 侧边x bgszm.append('{}{}'.format('%02d'%a,'%02d'%b)) print(bgszm) # 3宫格排列底3侧2共6套,底边格子数11 # 3宫格排列底3侧2共6套,侧边格子数7 # ['0000', '0004', '0008', '0400', '0404', '0408'] # 转为元祖 start_coordinates = [(int(s[0:2]), int(s[2:4])) for s in bgszm] cell_coordinates = [] # 推算每个起始格子后面的单元格数字 for start_coord in start_coordinates: i, j = start_coord subgrid_coordinates = [] for x in range(hs): for y in range(hs): subgrid_coordinates.append((i + x, j + y)) cell_coordinates.append(subgrid_coordinates) # 打印结果(元祖样式) bg=[] for coordinates in cell_coordinates: # print(coordinates) # [(4, 8), (4, 9), (4, 10), (5, 8), (5, 9), (5, 10), (6, 8), (6, 9), (6, 10)] for c in coordinates: print(c) # 元组 (1, 2) 样式 s = ''.join(str(num).zfill(2) for num in c) # zfill将元组 (1, 2) 转换为字符串 '0102' 特别是(5,10)这种必须转成2个数字0510 print(str(s)) # '12' bg.append(s) # '0102' print(bg) print('------第2步:制作3宫格的12套题的内容-------') # 制作3宫格的12套题目(没有空格,只有基础模板) lst=[] for b in range(1,hs+1): lst.append(b) print(lst) permutations_list = list(permutations(lst)) numbers = [list(permutation) for permutation in permutations_list] # print(numbers) # [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]] # 6种组合 # 互相组合成3组 import itertools # 计算排列数量并生成所有可能的排列 combinations2 = list(itertools.permutations(numbers, hs)) # 输出排列数量 # print(len(combinations2)) # 120 # # 把所有数字都提取成元素 ll=[] for o1 in combinations2: for o2 in o1: for o3 in o2: ll.append(o3) # print(ll) # print(len(ll)) # 1080 v=hs*hs # 16个数字抽取一组 f=[] for i in range(int(len(ll)/v)): f.append(ll[i*v:i*v+v]) # print(f) # print(len(f)) #120条 # # # 遍历表格,把0、5、10相同的内容删除,横向的数字1234都正确了,现在只要排除竖向不对的 P=[] zz=[] u=[] for k in f: if int(k[0])!=int(k[4])and int(k[0])!=int(k[8])and int(k[0])!=int(k[12]) and int(k[4])!=int(k[8]) and int(k[4])!=int(k[12])and int(k[8])!=int(k[12]) and int(k[0])+int(k[4])+int(k[8])+int(k[12])==10 and \ int(k[1])!=int(k[5])and int(k[1])!=int(k[9])and int(k[1])!=int(k[13]) and int(k[5])!=int(k[9]) and int(k[5])!=int(k[13])and int(k[9])!=int(k[13]) and int(k[1])+int(k[5])+int(k[9])+int(k[13])==10 and \ int(k[2])!=int(k[6])and int(k[2])!=int(k[10])and int(k[2])!=int(k[14]) and int(k[6])!=int(k[10]) and int(k[6])!=int(k[14])and int(k[10])!=int(k[14]) and int(k[2])+int(k[6])+int(k[10])+int(k[14])==10 and\ int(k[3])!=int(k[7])and int(k[3])!=int(k[11])and int(k[3])!=int(k[15]) and int(k[7])!=int(k[11]) and int(k[7])!=int(k[15])and int(k[11])!=int(k[15]) and int(k[3])+int(k[7])+int(k[11])+int(k[15])==10: zz.append(k) print(zz) print('不重复题目数量{}'.format(len(zz))) # 不重复题目数量768 for hh in zz: for ss in hh: u.append(ss) # print(u) print('所有元素长度{}'.format(len(u))) # 所有元素长度12288 # 27个16元素,在一页上 bb=hs*hs*db*cb print(bb) # 4*4*4*3=192. 64张 for kk in range(int(len(u)/int(bb))): # bb=192,kk=0-64 P.append(u[kk*bb:kk*bb+bb]) print(P) print(len(P)) # 12道题目 print('------第3步:写入docx,word表格正好12格子,写入1页12个-------') # 这里 for z in range(len(P)): doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\数独\数独长方形({}宫格).docx'.format(hs)) # table = doc.tables[0] # 表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[z][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(size) #是否加粗 # 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博主「红色小小螃蟹」, 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长方形数独宫格14.0 {}宫格基础模板共计{}套({}张).pdf" .format(hs,len(zz),z+1)) file_merger.close() # doc.Close() # # print('----------第5步:删除临时文件夹------------') import shutil shutil.rmtree('C:/Users/jg2yXRZ/OneDrive/桌面/数独/零时Word') #递归删除文件夹,即:删除非空文件夹 time.sleep(3) # 防止转换时报错,预留生成时间 48份生成用多长时间? 22:00第0份→22:05 第19份→22:12 大约12分钟 48页12套=576套 目测貌似没有错误(可能有错误,欢迎指出) 后续思考: 1、没想到4宫格16个数字,就有576种数独排列可能,再试试5宫格,希望程序能撑的出那么多数据 2、排除同行、同类相同数字的代码最好能 简化,否则写5宫格的时候会很长很长T_T【教学类-43-14】20240103(4宫格数独:正确版:576套)不重复的基础模板数量:576套由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【教学类-43-14】20240103(4宫格数独:正确版:576套)不重复的基础模板数量:576套”