| 
 
	积分3625贡献 精华在线时间 小时注册时间2014-10-21最后登录1970-1-1 
 | 
 
| 
今天微信群里有个小学数学题,貌似有点难度
x
登录后查看更多精彩内容~您需要 登录 才可以下载或查看,没有帐号?立即注册 
  
 
 
   
 
 我用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]]
 
 
 
   
 
 #数组中随机选一:
 #print(rm.choice([2,3,4]))
 
 
 
 
 
 
 
 | 
 |