• 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。


     思路:广度遍历+剪枝

    1. #!/usr/bin/env python
    2. # coding: utf-8
    3. # In[15]:
    4. def cmp(a,b): #比较是否一致
    5. if a==b:
    6. return 1
    7. return 0
    8. def getsite(A):#得到.的位置,下标
    9. t=0
    10. for i in A:
    11. if i=='.':
    12. return t
    13. t+=1
    14. def getP(A,B,finds,):#A是当前状态,finds里记录已经遍历过的状态
    15. t=getsite(A) #得到下标
    16. Next=set() #广度优先遍历的对垒,我用的集合来实现访问元素的存储
    17. if t%3>0: #判断能够往哪个方向走
    18. a=A.copy()
    19. temp=a[t-1]
    20. a[t]=temp
    21. a[t-1]='.'
    22. if ''.join(a) not in finds: #如果不在状态记录集合finds里,则加入到里面
    23. finds.add(''.join(a))
    24. Next.add(''.join(a)) #为下一轮广度遍历准备
    25. if ''.join(a)==B: #移动后发现和结束状态end一样,则结束,返回1
    26. return 1
    27. if t%3<2: #判断能够往哪个方向走
    28. a=A.copy()
    29. temp=a[t+1]
    30. a[t]=temp
    31. a[t+1]='.'
    32. if ''.join(a) not in finds:
    33. finds.add(''.join(a))
    34. Next.add(''.join(a))
    35. if ''.join(a)==B:
    36. return 1
    37. if t/3>1: #判断能够往哪个方向走
    38. a=A.copy()
    39. temp=a[t-3]
    40. a[t]=temp
    41. a[t-3]='.'
    42. if ''.join(a) not in finds:
    43. finds.add(''.join(a))
    44. Next.add(''.join(a))
    45. if ''.join(a)==B:
    46. return 1
    47. if t/3<2: #判断能够往哪个方向走
    48. a=A.copy()
    49. temp=a[t+3]
    50. a[t]=temp
    51. a[t+3]='.'
    52. if ''.join(a) not in finds:
    53. finds.add(''.join(a))
    54. Next.add(''.join(a))
    55. if ''.join(a)==B:
    56. return 1
    57. return Next
    58. def main(start,end):
    59. A=list(start) #初始状态
    60. B=end #最终状态
    61. finds=set() #遍历过的状态,存储一下
    62. Next_path=getP(A,B,finds) #先入队,或者入集合,方便广度遍历
    63. c=1 #记录路径长度,默认是1
    64. while(Next_path):#是否能够继续移动. 集合为空说明不能在移动了,状态都遍历过了
    65. S1=set() #当前要入队,准备广度遍历的状态
    66. c+=1
    67. for i in Next_path: #广度遍历
    68. #print(i)
    69. s=getP(list(i),B,finds) #i状态下的的广度一轮遍历
    70. if s==1: #如果返回的1则说明找到了
    71. return c
    72. else: #还没找到,准备下一轮遍历,将下一轮的状态集合合并
    73. #print('s',s)
    74. S1=S1|s
    75. Next_path=S1 #更新广度遍历的候选状态
    76. return -1
    77. #main('12345678.','123.46758')
    78. #main('12345678.','152743.86') #测试一
    79. #main('12345678.','12356.784') #测试二
    80. #main('2315.6784','8235164.7') #测试三
    81. #main('13524678.','46758123.') #测试四
    82. #main('12345678.','87654321.') #测试五
    83. main('.87654321','12345678.') #测试六

  • 相关阅读:
    【问题解决】蓝牙显示已配对,无法连接,蓝牙设备显示在其他设备中。
    java毕业设计——基于java+Java awt+swing的愤怒的小鸟游戏设计与实现(毕业论文+程序源码)——愤怒的小鸟游戏
    SAP PS 第八节 PS 常见问题处理-来源于SAP EPPM分享
    CMake中configure_file的使用
    Python学习-实现简单的http服务
    OpenGL之窗口的创建
    黑马mybatis练习项目导入父工程pom.xml爆红解决方式
    手写Promise.all/race/any/settled方法
    我眼中的大数据(二)——HDFS
    Jira使用浅谈篇一
  • 原文地址:https://blog.csdn.net/qq_27047075/article/details/127709525