小魔方(Python代码 + 对应方法 + 方法原理讲解)
方法以及原理讲解在最下边 这边先放代码 Python刚学不久 献丑了
(视频是纯手工操作 非代码)
如果是用Python解 我的代码如下:
def pd():
for p in range(1 ,10):
if sl[p] == 10:
sl[p] = 1
def j_1():
sl[1] += 1
sl[2] += 1
sl[4] += 1
ls[0] += 1
pd()
def j_2():
sl[1] += 1
sl[2] += 1
sl[3] += 1
sl[5] += 1
ls[1] += 1
pd()
def j_3():
sl[2] += 1
sl[3] += 1
sl[6] += 1
ls[2] += 1
pd()
def j_4():
sl[1] += 1
sl[4] += 1
sl[5] += 1
sl[7] += 1
ls[3] += 1
pd()
def j_5():
sl[2] += 1
sl[4] += 1
sl[5] += 1
sl[6] += 1
sl[8] += 1
ls[4] += 1
pd()
def j_6():
sl[3] += 1
sl[5] += 1
sl[6] += 1
sl[9] += 1
ls[5] += 1
pd()
def j_7():
sl[4] += 1
sl[7] += 1
sl[8] += 1
ls[6] += 1
pd()
def j_8():
sl[5] += 1
sl[7] += 1
sl[8] += 1
sl[9] += 1
ls[7] += 1
pd()
def j_9():
sl[6] += 1
sl[8] += 1
sl[9] += 1
ls[8] += 1
pd()
sl = [0]
ls = [0, 0, 0, 0, 0, 0, 0, 0, 0]
while True:
for i in range(9):
sl.append(eval(input('一到第九格逐个输入 每输入一格按一次回车')))
if sl[-1] not in list(range(1, 10)):
sl = [0]
print("输入错误,请重新输入")
break
else:
break
while sl[1] != sl[2]:
j_3()
while sl[1] != sl[4]:
j_7()
while sl[2] != sl[3]:
j_6()
while sl[4] != sl[7]:
j_8()
while sl[6] != sl[8]:
j_2()
j_7()
while sl[6] != sl[1]:
j_9()
while sl[1] != sl[9]:
j_1()
j_6()
j_8()
if sl[1] != sl[5]:
v_1 = sl[1]
v_2 = sl[5]
cou = 0
while True:
v_1 += 3
v_2 += 4
cou += 1
if v_1 % 9 == v_2 % 9:
break
for j in range(9):
if j == 4:
continue
else:
ls[j] += cou
for l in range(9):
ls[l] %= 9
print(ls)
#输出结果有9个数字 从第一到第九分别代表对应的每格需要按下的次数 按完即通关
方法如下:
第一步:九宫格任意一个角都可以 我这边是选择了左上角 如视频 我先让左上角三格按照第一格的数字调整(也可以是任意数字 看你喜欢)
第二步:让右上角和左下角的数字与第一步调整的数字(即第一格数字,后面我都会管他们叫第一格)一致
第三步:一次第二格和一次第七格为一组 一次按一组 按到第八格与第六格一致
(当然 三四为一组也行)
第四步:按第九格 按到第六格和第一格一致
第五步:(一次第一格 + 一次第六格 + 一次第八格)为一组 按到第一格与第九格一致
最后一步:此时外围8格数字是相同的(运气好九格都相同 那就可以省略这一步直接过关)
外围8格各按一次为一组 按到通关为止
原理:
如第三步 第二第七为一组可使之前调整出的数字各个相同 又能以1为单位向上调整第八格 使其与第六格一致 再通过第四步 以1为单位同步调整第六第八格 使他们跟上大部队 现在就剩第五和第九两个孤儿
第五步原理:一组(一次第一格 + 一次第六格 + 一次第八格)可以做到除五和九外的所有格以1为单位向上调整以及第九格以2为单位向上调整 两方调整的单位相差1 所以若干组之后 外围8格一定能一致
最后一步原理:
外围8格各按一次可以使外围8格以3为单位向上调整以及第五格以4为单位向上调整 两方调整的单位差还是1 所以若干组之后 9格一定能一致
以上组数也一定不会超过8次
我的这一套方法做下来 核心就在于调整的单位差 或许有些格子需要按的次数超过了9次 很明显 9次一循环 所以以上方法或许得做很多不必要的事 最简的方法一定是每格按的次数皆不超过8次 但方法就是这样 要一步一步来 这一关我也只研究到这 毕竟再研究别的方法我还得重新构思代码 我暂时没别的办法 不过这一步在Python代码中可以做到尽量省 即 每一格次数除以9 得到的余数为最简方法