- 积分
- 3638
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 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]))
|
|