【教学类-43-15】 20240103 (5宫格数独:内存数据不够计算) 运用math预测N*N最大排序数量

作品展示:

 运用math预测N*N最大排序数量

背景需求:

测试5宫格有多少种不重复的基础模板(只测试所有的25数字一组有多少个)





# 测试11*11格,2*2一共4套3*3 宫格
'''
目的:数独14    5宫格有不同的基础模板
作者:阿夏
时间:2024年01月04日 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=5
# int(input('3宫格数独=3\n'))
hs=hsall



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)))

运行了90分钟,结果报错 MemoryError,显示内存不够计算

显示内存不够计算

解决思路,通过代码推理数量

一、测试N宫格有多少组不同的排列方法

3宫格基本数字"[1, 2, 3]"
3宫格可以组成基本样式[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
3宫格可以组成基本样式数量"6"组


'''
目的:测试N宫格可以生成多少组基本样式[1,2,3,4,5][5,4,3,2,1]}
作者:阿夏
时间:2024年1月5日19:00
'''

import random
import math
from itertools import permutations

# 宫格数


gg=[1,2,3,4,5,6,7,8,9]
# gg=[5]
ggg=[]
for hs in gg:
    n=[]
    for nu in range(1,hs+1):
        n.append(nu)
    # lst = ''.join(str(num) for num in n)
    # print(n)

    print('{}宫格基本数字"{}"'.format(hs,n))
    # 3宫格,基础数字是'123'

    # 123中间随机抽取3个,不同的3个数字排序方法
    permutations_list = list(permutations(n))
    numbers = [list(permutation) for permutation in permutations_list]
    # numbers = ''.join(str(num) for num in number)
    # print(numbers)
    print('{}宫格可以组成基本样式"{}"组'.format(hs,len(numbers)))
    # [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]# 6种组合
    
'''
1宫格基本数字"1"
1宫格可以组成基本样式"1"组   
2宫格基本数字"12"
2宫格可以组成基本样式"2"组   
3宫格基本数字"123"
3宫格可以组成基本样式"6"组   
4宫格基本数字"1234"
4宫格可以组成基本样式"24"组  
5宫格基本数字"12345"
5宫格可以组成基本样式"120"组 
6宫格基本数字"123456"        
6宫格可以组成基本样式"720"组 
7宫格基本数字"1234567"       
7宫格可以组成基本样式"5040"组
8宫格基本数字"12345678"      
8宫格可以组成基本样式"40320"组
9宫格基本数字"123456789"      
9宫格可以组成基本样式"362880"组
'''

5宫格基本数字"[1, 2, 3, 4, 5]"
3宫格可以组成基本样式[[1, 2, 3, 4, 5], [1, 2, 3, 5, 4], [1, 2, 4, 3, 5], [1, 2, 4, 5, 3], [1, 2, 5, 3, 4], [1, 2, 5, 4, 3], [1, 3, 2, 4, 5], [1, 3, 2, 5, 4], [1, 3, 4, 2, 5], [1, 3, 4, 5, 2], [1, 3, 5, 2, 4], [1, 3, 5, 4, 2], [1, 4, 2, 3, 5], [1, 4, 2, 5, 3], [1, 4, 3, 2, 5], [1, 4, 3, 5, 2], [1, 4, 5, 2, 3], [1, 4, 5, 3, 2], [1, 5, 2, 3, 4], [1, 5, 2, 4, 3], [1, 5, 3, 2, 4], [1, 5, 3, 4, 2], [1, 5, 4, 2, 3], [1, 5, 4, 3, 2], [2, 1, 3, 4, 5], [2, 1, 3, 5, 4], [2, 1, 4, 3, 5], [2, 1, 4, 5, 3], [2, 1, 5, 3, 4], [2, 1, 5, 4, 3], [2, 3, 1, 4, 5], [2, 3, 1, 5, 4], [2, 3, 4, 1, 5], [2, 3, 4, 5, 1], [2, 3, 5, 1, 4], [2, 3, 5, 4, 1], [2, 4, 1, 3, 5], [2, 4, 1, 5, 3], [2, 4, 3, 1, 5], [2, 4, 3, 5, 1], [2, 4, 5, 1, 3], [2, 4, 5, 3, 1], [2, 5, 1, 3, 4], [2, 5, 1, 4, 3], [2, 5, 3, 1, 4], [2, 5, 3, 4, 1], [2, 5, 4, 1, 3], [2, 5, 4, 3, 1], [3, 1, 2, 4, 5], [3, 1, 2, 5, 4], [3, 1, 4, 2, 5], [3, 1, 4, 5, 2], [3, 1, 5, 2, 4], [3, 1, 5, 4, 2], [3, 2, 1, 4, 5], [3, 2, 1, 5, 4], [3, 2, 4, 1, 5], [3, 2, 4, 5, 1], [3, 2, 5, 1, 4], [3, 2, 5, 4, 1], [3, 4, 1, 2, 5], [3, 4, 1, 5, 2], [3, 4, 2, 1, 5], [3, 4, 2, 5, 1], [3, 4, 5, 1, 2], [3, 4, 5, 2, 1], [3, 5, 1, 2, 4], [3, 5, 1, 4, 2], [3, 5, 2, 1, 4], [3, 5, 2, 4, 1], [3, 5, 4, 1, 2], [3, 5, 4, 2, 1], [4, 1, 2, 3, 5], [4, 1, 2, 5, 3], [4, 1, 3, 2, 5], [4, 1, 3, 5, 2], [4, 1, 5, 2, 3], [4, 1, 5, 3, 2], [4, 2, 1, 3, 5], [4, 2, 1, 5, 3], [4, 2, 3, 1, 5], [4, 2, 3, 5, 1], [4, 2, 5, 1, 3], [4, 2, 5, 3, 1], [4, 3, 1, 2, 5], [4, 3, 1, 5, 2], [4, 3, 2, 1, 5], [4, 3, 2, 5, 1], [4, 3, 5, 1, 2], [4, 3, 5, 2, 1], [4, 5, 1, 2, 3], [4, 5, 1, 3, 2], [4, 5, 2, 1, 3], [4, 5, 2, 3, 1], [4, 5, 3, 1, 2], [4, 5, 3, 2, 1], [5, 1, 2, 3, 4], [5, 1, 2, 4, 3], [5, 1, 3, 2, 4], [5, 1, 3, 4, 2], [5, 1, 4, 2, 3], [5, 1, 4, 3, 2], [5, 2, 1, 3, 4], [5, 2, 1, 4, 3], [5, 2, 3, 1, 4], [5, 2, 3, 4, 1], [5, 2, 4, 1, 3], [5, 2, 4, 3, 1], [5, 3, 1, 2, 4], [5, 3, 1, 4, 2], [5, 3, 2, 1, 4], [5, 3, 2, 4, 1], [5, 3, 4, 1, 2], [5, 3, 4, 2, 1], [5, 4, 1, 2, 3], [5, 4, 1, 3, 2], [5, 4, 2, 1, 3], [5, 4, 2, 3, 1], [5, 4, 3, 1, 2], [5, 4, 3, 2, 1]]

5宫格可以组成基本样数量"120"组

参考AI对话大师的答案,使用math计算方法

加上math计算


'''
目的:测试N宫格可以生成多少组基本样式[1,2,3,4,5][5,4,3,2,1]}
作者:阿夏
时间:2024年1月5日19:00
'''

import random
import math
from itertools import permutations

# 宫格数


gg=[1,2,3,4,5,6,7,8,9]
# gg=[5]
ggg=[]
for hs in gg:
    n=[]
    for nu in range(1,hs+1):
        n.append(nu)
    # lst = ''.join(str(num) for num in n)
    # print(n)

    print('{} 宫格基本数字 "{} "'.format(hs,n))
    # 3宫格,基础数字是'123'

    # 123中间随机抽取3个,不同的3个数字排序方法
    permutations_list = list(permutations(n))
    numbers = [list(permutation) for permutation in permutations_list]
    # numbers = ''.join(str(num) for num in number)
    # print(numbers)
    print('{} 宫格可以组成基本样式" {} "组'.format(hs,len(numbers)))
    # [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]# 6种组合


    # math生成可能的数量
    combinations = math.comb(len(numbers), hs)

    print("math法{} 宫格可以生成 {} 组不同的列表".format(hs ,combinations))
    
    # 在原有基础上乘上基本样式组的数量,如宫格基本样式是6组【123】【132】【213】【231】【312】【321】,通过互相交叉选取3个为一组,会有20种可能
    # 最后需要20*6=120,才是最大的生成数量。因此math计算后,还要乘以基本样式数量
    print("实际法{} 宫格可以生成{} 组不同的列表".format(hs ,combinations*len(numbers)))
    print('---------------')

结果:

1宫格基本数字"[1]"
1宫格可以组成基本样式"1"组
math法1宫格可以生成1组不同的列表
实际法1宫格可以生成1组不同的列表
---------------
2宫格基本数字"[1, 2]"
2宫格可以组成基本样式"2"组
math法2宫格可以生成1组不同的列表
实际法2宫格可以生成2组不同的列表
---------------
3宫格基本数字"[1, 2, 3]"
3宫格可以组成基本样式"6"组
math法3宫格可以生成20组不同的列表
实际法3宫格可以生成120组不同的列表
---------------
4宫格基本数字"[1, 2, 3, 4]"
4宫格可以组成基本样式"24"组
math法4宫格可以生成10626组不同的列表
实际法4宫格可以生成255024组不同的列表

---------------

以下不能用Python计算(数量太多了 )


5宫格基本数字"[1, 2, 3, 4, 5]"
5宫格可以组成基本样式"120"组
math法5宫格可以生成190578024组不同的列表
实际法5宫格可以生成22869362880组不同的列表
---------------
6宫格基本数字"[1, 2, 3, 4, 5, 6]"
6宫格可以组成基本样式"720"组
math法6宫格可以生成189492294437160组不同的列表
实际法6宫格可以生成136434451994755200组不同的列表
---------------
7宫格基本数字"[1, 2, 3, 4, 5, 6, 7]"
7宫格可以组成基本样式"5040"组
math法7宫格可以生成16321981448897949868560组不同的列表
实际法7宫格可以生成82262786502445667337542400组不同的列表
---------------
8宫格基本数字"[1, 2, 3, 4, 5, 6, 7, 8]"
8宫格可以组成基本样式"40320"组
math法8宫格可以生成173117930575796585984663510371920组不同的列表
实际法8宫格可以生成6980114960816118346901632738195814400组不同的列表
---------------
9宫格基本数字"[1, 2, 3, 4, 5, 6, 7, 8, 9]"
9宫格可以组成基本样式"362880"组
math法9宫格可以生成300649979042426162195454856425990347600496000组不同的列表
实际法9宫格可以生成109099864394915605737486658299863377337267988480000组不同的列表

为什么math的结果还要乘以基本组的数量?这是根据3宫格、4宫格的生成数据,倒推出来

同理符合1宫格、2宫格的情况

实际出现的数量是并不是符合数独要求的最大数量,是所有可能性排列的数量,所以数量非常大,电脑最多存储百万个元素,再大就不行了。

因此,我不再对5宫格以上的数独进行题目数量的测试了!

最近更新

  1. TCP协议是安全的吗?

    2024-01-06 23:26:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-06 23:26:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-06 23:26:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-06 23:26:01       18 阅读

热门阅读

  1. 【多线程】

    2024-01-06 23:26:01       41 阅读
  2. C++第五天

    2024-01-06 23:26:01       31 阅读
  3. Binius:助力ZK行业发展

    2024-01-06 23:26:01       36 阅读
  4. nodejs01

    nodejs01

    2024-01-06 23:26:01      36 阅读
  5. vue 异步加载组件

    2024-01-06 23:26:01       38 阅读
  6. Copilot在IDEA中的应用:提升编码效率的得力助手

    2024-01-06 23:26:01       42 阅读
  7. Vivado link synplify edf 和 xilinx ip或者原语

    2024-01-06 23:26:01       41 阅读