爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 15185|回复: 2

[混合编程] python蒙特卡洛求小学数学题

[复制链接]

新浪微博达人勋

发表于 2020-2-20 20:14:39 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
今天微信群里有个小学数学题,貌似有点难度


题目.jpg


我用python写了个暴力破解的程序,后来发现并不简单,循环十万次也没出结果


import numpy as np
import random as rm
#新建9个1+9个2+9个3+9个4的数组,后面循环中随机打乱
x=np.arange(36)    #用range(36)是不行的
for i in range(36):
    x=int(x/9)+1


#循环计算找结果:
for loop in range(100):
   
    print('循环次数=',loop)
   
    #洗牌:
    rm.shuffle(x)
    #整变形为6*6:
    y=x.reshape((6,6))
   
    #因为我也不知道如何判断形状相同
    #暂且以形状的连续性作为一个判据
    #对于每个元素,如果其周边没有同值的,说明拼图出现断裂
   
    #默认没有断裂:
    crack=0
   
    #检查内部4*4的数组:
    for i in range(4):
        for j in range(4):
            if y[j+1] != y[i+1][j+1] and \ #续行符
            y[i+2][j+1] != y[i+1][j+1] and \
            y[i+1][j] != y[i+1][j+1] and \
            y[i+1][j+2] != y[i+1][j+1] :
                #一旦出现断裂,记录之,跳出:   
                crack=1
                break
   
    #检查4个角:
    if y[0][0] != y[1][0] and y[0][0] != y[0][1]:
        crack=1


    if y[5][0] != y[4][0] and y[5][0] != y[5][1]:
        crack=1


    if y[0][5] != y[0][4] and y[0][5] != y[1][5]:
        crack=1


    if y[5][5] != y[5][4] and y[5][5] != y[4][5]:
        crack=1
        
    #检查上边界:
    for i in range(4):
        if y[0][i+1] != y[0] and y[0][i+1] != y[0][i+2] and y[0][i+1] != y[1][i+1]:
            crack=1


   
    #检查下边界:
    for i in range(4):
        if y[5][i+1] != y[5] and y[5][i+1] != y[5][i+2] and y[5][i+1] != y[4][i+1]:
            crack=1


   
    #检查左边界:
    for i in range(4):
        if y[i+1][0] != y[0] and y[i+1][0] != y[i+2][0] and y[i+1][0] != y[i+1][1]:
            crack=1


   
    #检查右边界:
    for i in range(4):
        if y[i+1][5] != y[5] and y[i+1][5] != y[i+2][5] and y[i+1][5] != y[i+1][4]:
            crack=1


   
   
   
   
   
   
    #如果未发现断裂,则输出该结果:   
    if crack == 0:
        print('找出了结果!')
        print(y)
        break

#不输出个啥,不知道程序结束没,IDL可以看运行按钮的变化,python却没有这种显示
#程序结束:
print('over')


#试验证明,十万次的结算也没有找出正确结果,
#想找出多个结果,更是遥遥无期
#看来,这种蒙特卡洛式的暴力计算效率还是太低了
#我构想的新算法,从既定的4个圆开始,四种颜色轮流贴边填充
#这种方法也存在逐一尝试的部分,但是计算量肯定比以上的少很多


#答案之一:   
#    y=[[1,1,1,1,1,2],
#       [3,1,2,2,2,2],
#       [3,1,2,4,4,2],
#       [3,1,1,3,4,2],
#       [3,3,3,3,4,2],
#       [3,4,4,4,4,4]]


答案.jpg


#数组中随机选一:
#print(rm.choice([2,3,4]))






密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-2-24 10:11:11 | 显示全部楼层
我对您的敬仰之情油然而生!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-9-21 16:10:46 | 显示全部楼层
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表