鱼C论坛

 找回密码
 立即注册
查看: 3021|回复: 12

大佬们帮忙看一下,python解三阶魔方有沒有更快的方法

[复制链接]
发表于 2019-7-8 21:16:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本人做了一个解三阶魔方的程序,但是步骤稍微多一点就用时较长,麻烦各位帮忙看一下有没有更高效的方法
下面是代码
  1. #导入easygui模块
  2. import easygui as eg

  3. #得到每一面的颜色分布(里面说的图片在下面)
  4. b = eg.multenterbox("请按从上到下,从左到右的顺序输入中心点为蓝面的颜色(如图 蓝.png 所示):","输入",["1","2","3","4","5","6","7","8","9"])
  5. g = eg.multenterbox("请按从上到下,从左到右的顺序输入中心点为绿面的颜色(如图 绿.png 所示):","输入",["1","2","3","4","5","6","7","8","9"])
  6. o = eg.multenterbox("请按从上到下,从左到右的顺序输入中心点为橙面的颜色(如图 橙.png 所示):","输入",["1","2","3","4","5","6","7","8","9"])
  7. r = eg.multenterbox("请按从上到下,从左到右的顺序输入中心点为红面的颜色(如图 红.png 所示):","输入",["1","2","3","4","5","6","7","8","9"])
  8. y = eg.multenterbox("请按从上到下,从左到右的顺序输入中心点为黄面的颜色(如图 黄.png 所示):","输入",["1","2","3","4","5","6","7","8","9"])
  9. w = eg.multenterbox("请按从上到下,从左到右的顺序输入中心点为白面的颜色(如图 白.png 所示):","输入",["1","2","3","4","5","6","7","8","9"])
  10. b1 = b[:];g1 = g[:];o1 = o[:];r1 = r[:];y1 = y[:];w1 = w[:]
  11. b0 = b[:];g0 = g[:];o0 = o[:];r0 = r[:];y0 = y[:];w0 = w[:]

  12. #定义转动魔方的函数(用改变每一面的列表的元素的方式)(函数名直接沿用魔方公式的字母,详见下面的图)
  13. def U():
  14.     global b;global b1;global g;global g1;global o;global o1;global r;global r1;global y;global y1
  15.     o[0:3] = b1[0:3];g[0:3] = o1[0:3];r[0:3] = g1[0:3];b[0:3] = r1[0:3]
  16.     y[0] = y1[6];y[1] = y1[3];y[2] = y1[0];y[3] = y1[7];y[5] = y1[1];y[6] = y1[8];y[7] = y1[5];y[8] = y1[2]
  17.     b1 = b[:];g1 = g[:];o1 = o[:];r1 = r[:];y1 = y[:]
  18. def U1():
  19.     global b;global b1;global g;global g1;global o;global o1;global r;global r1;global y;global y1
  20.     b[0:3] = o1[0:3];o[0:3] = g1[0:3];g[0:3] = r1[0:3];r[0:3] = b1[0:3]
  21.     y[0] = y1[2];y[1] = y1[5];y[2] = y1[8];y[3] = y1[1];y[5] = y1[7];y[6] = y1[0];y[7] = y1[3];y[8] = y1[6]
  22.     b1 = b[:];g1 = g[:];o1 = o[:];r1 = r[:];y1 = y[:]
  23. def R():
  24.     global b;global b1;global g;global g1;global w;global w1;global r;global r1;global y;global y1
  25.     b[2] = w1[2];b[5] = w1[5];b[8] = w1[8]
  26.     y[2] = b1[2];y[5] = b1[5];y[8] = b1[8]
  27.     g[0] = y1[8];g[3] = y1[5];g[6] = y1[2]
  28.     w[2] = g1[6];w[5] = g1[3];w[8] = g1[0]
  29.     r[0] = r1[6];r[1] = r1[3];r[2] = r1[0];r[3] = r1[7];r[5] = r1[1];r[6] = r1[8];r[7] = r1[5];r[8] = r1[2]
  30.     b1 = b[:];g1 = g[:];w1 = w[:];r1 = r[:];y1 = y[:]
  31. def R1():
  32.     global b;global b1;global g;global g1;global w;global w1;global r;global r1;global y;global y1
  33.     w[2] = b1[2];w[5] = b1[5];w[8] = b1[8]
  34.     b[2] = y1[2];b[5] = y1[5];b[8] = y1[8]
  35.     y[8] = g1[0];y[5] = g1[3];y[2] = g1[6]
  36.     g[0] = w1[8];g[3] = w1[5];g[6] = w1[2]
  37.     r[0] = r1[2];r[1] = r1[5];r[2] = r1[8];r[3] = r1[1];r[5] = r1[7];r[6] = r1[0];r[7] = r1[3];r[8] = r1[6]
  38.     b1 = b[:];g1 = g[:];w1 = w[:];r1 = r[:];y1 = y[:]
  39. def F():
  40.     global b;global b1;global o;global o1;global w;global w1;global r;global r1;global y;global y1
  41.     y[6] = o1[8];y[7] = o1[5];y[8] = o1[2]
  42.     r[0] = y1[6];r[3] = y1[7];r[6] = y1[8]
  43.     w[0] = r1[6];w[1] = r1[3];w[2] = r1[0]
  44.     o[2] = w1[0];o[5] = w1[1];o[8] = w1[2]
  45.     b[0] = b1[6];b[1] = b1[3];b[2] = b1[0];b[3] = b1[7];b[5] = b1[1];b[6] = b1[8];b[7] = b1[5];b[8] = b1[2]
  46.     b1 = b[:];o1 = o[:];w1 = w[:];r1 = r[:];y1 = y[:]
  47. def F1():
  48.     global b;global b1;global o;global o1;global w;global w1;global r;global r1;global y;global y1
  49.     o[8] = y1[6];o[5] = y1[7];o[2] = y1[8]
  50.     y[6] = r1[0];y[7] = r1[3];y[8] = r1[6]
  51.     r[0] = w1[2];r[3] = w1[1];r[6] = w1[0]
  52.     w[0] = o1[2];w[1] = o1[5];w[2] = o1[8]
  53.     b[0] = b1[2];b[1] = b1[5];b[2] = b1[8];b[3] = b1[1];b[5] = b1[7];b[6] = b1[0];b[7] = b1[3];b[8] = b1[6]
  54.     b1 = b[:];o1 = o[:];w1 = w[:];r1 = r[:];y1 = y[:]
  55. def D():
  56.     global b;global b1;global g;global g1;global o;global o1;global r;global r1;global w;global w1
  57.     b[6:9] = o1[6:9];o[6:9] = g1[6:9];g[6:9] = r1[6:9];r[6:9] = b1[6:9]
  58.     w[0] = w1[6];w[1] = w1[3];w[2] = w1[0];w[3] = w1[7];w[5] = w1[1];w[6] = w1[8];w[7] = w1[5];w[8] = w1[2]
  59.     b1 = b[:];g1 = g[:];o1 = o[:];r1 = r[:];w1 = w[:]
  60. def D1():
  61.     global b;global b1;global g;global g1;global o;global o1;global r;global r1;global w;global w1
  62.     o[6:9] = b1[6:9];g[6:9] = o1[6:9];r[6:9] = g1[6:9];b[6:9] = r1[6:9]
  63.     w[0] = w1[2];w[1] = w1[5];w[2] = w1[8];w[3] = w1[1];w[5] = w1[7];w[6] = w1[0];w[7] = w1[3];w[8] = w1[6]
  64.     b1 = b[:];g1 = g[:];o1 = o[:];r1 = r[:];w1 = w[:]
  65. def L():
  66.     global b;global b1;global g;global g1;global w;global w1;global o;global o1;global y;global y1
  67.     w[0] = b1[0];w[3] = b1[3];w[6] = b1[6]
  68.     b[0] = y1[0];b[3] = y1[3];b[6] = y1[6]
  69.     y[0] = g1[8];y[3] = g1[5];y[6] = g1[2]
  70.     g[2] = w1[6];g[5] = w1[3];g[8] = w1[0]
  71.     o[0] = o1[6];o[1] = o1[3];o[2] = o1[0];o[3] = o1[7];o[5] = o1[1];o[6] = o1[8];o[7] = o1[5];o[8] = o1[2]
  72.     b1 = b[:];g1 = g[:];w1 = w[:];o1 = o[:];y1 = y[:]
  73. def L1():
  74.     global b;global b1;global g;global g1;global w;global w1;global o;global o1;global y;global y1
  75.     b[0] = w1[0];b[3] = w1[3];b[6] = w1[6]
  76.     y[0] = b1[0];y[3] = b1[3];y[6] = b1[6]
  77.     g[2] = y1[6];g[5] = y1[3];g[8] = y1[0]
  78.     w[0] = g1[8];w[3] = g1[5];w[6] = g1[2]
  79.     o[0] = o1[2];o[1] = o1[5];o[2] = o1[8];o[3] = o1[1];o[5] = o1[7];o[6] = o1[0];o[7] = o1[3];o[8] = o1[6]
  80.     b1 = b[:];g1 = g[:];w1 = w[:];o1 = o[:];y1 = y[:]
  81. def B():
  82.     global g;global g1;global o;global o1;global w;global w1;global r;global r1;global y;global y1
  83.     y[0] = r1[2];y[1] = r1[5];y[2] = r1[8]
  84.     r[2] = w1[8];r[5] = w1[7];r[8] = w1[6]
  85.     w[8] = o1[6];w[7] = o1[3];w[6] = o1[0]
  86.     o[0] = y1[2];o[3] = y1[1];o[6] = y1[0]
  87.     g[0] = g1[6];g[1] = g1[3];g[2] = g1[0];g[3] = g1[7];g[5] = g1[1];g[6] = g1[8];g[7] = g1[5];g[8] = g1[2]
  88.     g1 = g[:];o1 = o[:];w1 = w[:];r1 = r[:];y1 = y[:]
  89. def B1():
  90.     global g;global g1;global o;global o1;global w;global w1;global r;global r1;global y;global y1
  91.     y[0] = o1[6];y[1] = o1[3];y[2] = o1[0]
  92.     r[2] = y1[0];r[5] = y1[1];r[8] = y1[2]
  93.     w[8] = r1[2];w[7] = r1[5];w[6] = r1[8]
  94.     o[0] = w1[6];o[3] = w1[7];o[6] = w1[8]
  95.     g[6] = g1[0];g[3] = g1[1];g[0] = g1[2];g[7] = g1[3];g[1] = g1[5];g[8] = g1[6];g[5] = g1[7];g[2] = g1[8]
  96.     g1 = g[:];o1 = o[:];w1 = w[:];r1 = r[:];y1 = y[:]

  97. #制作一个生成器,参数list1是一个列表,每次给最后一个元素+1,并返回新列表;当一个元素等于12时,改为向前一个元素+1
  98. def main(list1):
  99.     n = 0
  100.     list1.reverse()
  101.     for i in list1.:
  102.         while i <= 12:
  103.             list1[n] = i
  104.             yield list1
  105.             i += 1
  106.         n += 1
  107. if __name__ == "__main__":
  108.     off = 0

  109.     #按步骤从小到大的顺序尝试还原方法
  110.     for j in range(1,183):  #这里的183是因为本人算过,三阶魔方最多用182步还原
  111.         list0 = []

  112.         #生成一个元素数量为步骤数的列表,每一项均为一
  113.         while j:
  114.             list0.append(1)
  115.             j -= 1
  116.         for k in main(list0):

  117.             #按照列表的步骤拧魔方,看看能不能还原
  118.             for m in k:
  119.                 if m == 1:
  120.                     U()
  121.                 elif m == 2:
  122.                     U1()
  123.                 elif m == 3:
  124.                     R()
  125.                 elif m == 4:
  126.                     R1()
  127.                 elif m == 5:
  128.                     F()
  129.                 elif m == 6:
  130.                     F1()
  131.                 elif m == 7:
  132.                     D()
  133.                 elif m == 8:
  134.                     D1()
  135.                 elif m == 9:
  136.                     L()
  137.                 elif m == 10:
  138.                     L1()
  139.                 elif m == 11:
  140.                     B()
  141.                 elif m == 12:
  142.                     B1()

  143.             #如果能还原,就把列表里的数值转换成人话
  144.             if b[0] == b[1] == b[2] == b[3] == b[4] == b[5] == b[6] == b[7] == b[8] and g[0] == g[1] == g[2] == g[3] == g[4] == g[5] == g[6] == g[7] == g[8] and o[0] == o[1] == o[2] == o[3] == o[4] == o[5] == o[6] == o[7] == o[8] and r[0] == r[1] == r[2] == r[3] == r[4] == r[5] == r[6] == r[7] == r[8] and y[0] == y[1] == y[2] == y[3] == y[4] == y[5] == y[6] == y[7] == y[8] and w[0] == w[1] == w[2] == w[3] == w[4] == w[5] == w[6] == w[7] == w[8]:
  145.                 ret = ""
  146.                 for p in k:
  147.                     if p == 1:
  148.                         ret += "U  "
  149.                     elif p == 2:
  150.                         ret += "U"  "
  151.                     elif p == 3:
  152.                         ret += "R  "
  153.                     elif p == 4:
  154.                         ret += "R"  "
  155.                     elif p == 5:
  156.                         ret += "F  "
  157.                     elif p == 6:
  158.                         ret += "F"  "
  159.                     elif p == 7:
  160.                         ret += "D  "
  161.                     elif p == 8:
  162.                         ret += "D"  "
  163.                     elif p == 9:
  164.                         ret += "L  "
  165.                     elif p == 10:
  166.                         ret += "L"  "
  167.                     elif p == 11:
  168.                         ret += "B  "
  169.                     elif p == 12:
  170.                         ret += "B"  "
  171.                 off = 1
  172.                 break
  173.         if off:
  174.             break

  175.     #输出s
  176.     if ret:
  177.         eg.msgbox("还原:" + ret,"输出")
  178.     else:
  179.         eg.msgbox("无法还原!","输出")
复制代码

D:\python文件\练习\魔方公式图解.png
D:\蓝.png
D:\绿.png
D:\橙.png
D:\红.png
D:\黄.png
D:\白.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-7-8 21:17:10 | 显示全部楼层
图看得见吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-9 20:19:12 | 显示全部楼层
哦我知道为什么了,程序有bug对不起,已经改完了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-20 18:20:51 | 显示全部楼层

想问下,这个代码输入的时候,比如蓝面1至9后面分别输入啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-20 21:35:25 | 显示全部楼层
鱼妹酱 发表于 2020-1-20 18:20
想问下,这个代码输入的时候,比如蓝面1至9后面分别输入啥

颜色用啥表示都可以,只要同种颜色用同一个字符串表示就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-20 21:44:15 | 显示全部楼层
这不是python的问题把。。。
这是解魔方的问题。cfop貌似正常不到100步吧,角先似乎更少,就是没人用。数学上似乎最少能够到26步。
你可以去魔方论坛问问那些sub10的大神都是用的什么方法。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-20 21:49:01 | 显示全部楼层
刚刚试了一盘cfop是72步 -
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-21 00:12:56 | 显示全部楼层
无法看到你的图片,不明白怎么操作程序

新鱼油参照下面链接贴图:
<font color="red">[已解决]</font>帖子怎么添加图片?
https://fishc.com.cn/thread-143565-1-1.html
(出处: 鱼C论坛)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-24 16:58:06 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-24 16:59:02 | 显示全部楼层
图片好了[img]https://s2.ax1x.com/2020/01/24/1ZtVv6.png

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
[/img]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-24 17:01:44 | 显示全部楼层
白色面的

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-24 17:17:44 From FishC Mobile | 显示全部楼层
定义一个魔方类
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-9 20:59:07 | 显示全部楼层
这个是不是有点儿问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-10 15:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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