fork download
  1. class Index:
  2. def __init__(self, i, j, k, lifetime):
  3. self.i = i
  4. self.j = j
  5. self.k = k
  6. self.lifetime = lifetime
  7.  
  8. def visit(self):
  9. print("[{}, {}, {}]".format(self.i, self.j, self.k))
  10.  
  11. # +I -> -j
  12. # -J -> -i
  13. # -I -> +j
  14. # +J -> +i
  15. # +K -> +I, -J, -I, +J
  16.  
  17. def StepMainPlusI(mainPlusI, minusJ, lifetime):
  18. result = []
  19. for m in mainPlusI:
  20. if lifetime > 0:
  21. minusJ.append(Index(m.i, m.j-1, m.k, lifetime))
  22. m.lifetime -= 1
  23. m.i += 1
  24. if m.lifetime > 0:
  25. result.append(m)
  26. return result
  27.  
  28. def StepMainMinusJ(mainMinusJ, minusI, lifetime):
  29. result = []
  30. for m in mainMinusJ:
  31. if lifetime > 0:
  32. minusI.append(Index(m.i-1, m.j, m.k, lifetime))
  33. m.lifetime -= 1
  34. m.j -= 1
  35. if m.lifetime > 0:
  36. result.append(m)
  37. return result
  38.  
  39. def StepMainMinusI(mainMinusI, plusJ, lifetime):
  40. result = []
  41. for m in mainMinusI:
  42. if lifetime > 0:
  43. plusJ.append(Index(m.i, m.j+1, m.k, lifetime))
  44. m.lifetime -= 1
  45. m.i -= 1
  46. if m.lifetime > 0:
  47. result.append(m)
  48. return result
  49.  
  50. def StepMainPlusJ(mainPlusJ, plusI, lifetime):
  51. result = []
  52. for m in mainPlusJ:
  53. if lifetime > 0:
  54. plusI.append(Index(m.i+1, m.j, m.k, lifetime))
  55. m.lifetime -= 1
  56. m.j += 1
  57. if m.lifetime > 0:
  58. result.append(m)
  59. return result
  60.  
  61. def StepMainPlusK(mainPlusK, mainPlusI, mainMinusI, mainPlusJ, mainMinusJ, lifetimeA, lifetimeB):
  62. result = []
  63. for m in mainPlusK:
  64. if lifetimeA > 0:
  65. mainPlusI.append(Index(+1, 0, m.k, lifetimeA))
  66. mainPlusJ.append(Index(0, +1, m.k, lifetimeA))
  67. if lifetimeB > 0:
  68. mainMinusI.append(Index(-1, 0, m.k, lifetimeB))
  69. mainMinusJ.append(Index(0, -1, m.k, lifetimeB))
  70. m.lifetime -= 1
  71. m.k += 1
  72. if m.lifetime > 0:
  73. result.append(m)
  74. return result
  75.  
  76. def StepMainMinusK(mainMinusK, mainPlusI, mainMinusI, mainPlusJ, mainMinusJ, lifetimeA, lifetimeB):
  77. result = []
  78. for m in mainMinusK:
  79. if lifetimeA > 0:
  80. mainPlusI.append(Index(+1, 0, m.k, lifetimeA))
  81. mainPlusJ.append(Index(0, +1, m.k, lifetimeA))
  82. if lifetimeB > 0:
  83. mainMinusI.append(Index(-1, 0, m.k, lifetimeB))
  84. mainMinusJ.append(Index(0, -1, m.k, lifetimeB))
  85. m.lifetime -= 1
  86. m.k -= 1
  87. if m.lifetime > 0:
  88. result.append(m)
  89. return result
  90.  
  91. def StepPlusI(plusI):
  92. result = []
  93. for m in plusI:
  94. m.i += 1
  95. m.lifetime -= 1
  96. if m.lifetime > 0:
  97. result.append(m)
  98. return result
  99.  
  100. def StepMinusI(minusI):
  101. result = []
  102. for m in minusI:
  103. m.i -= 1
  104. m.lifetime -= 1
  105. if m.lifetime > 0:
  106. result.append(m)
  107. return result
  108.  
  109. def StepPlusJ(plusJ):
  110. result = []
  111. for m in plusJ:
  112. m.j += 1
  113. m.lifetime -= 1
  114. if m.lifetime > 0:
  115. result.append(m)
  116. return result
  117.  
  118. def StepMinusJ(minusJ):
  119. result = []
  120. for m in minusJ:
  121. m.j -= 1
  122. m.lifetime -= 1
  123. if m.lifetime > 0:
  124. result.append(m)
  125. return result
  126.  
  127. def Traverse(N):
  128. halfA = halfB = (N-1)/2
  129. if N % 2 == 0:
  130. halfA = N/2
  131. halfB = N/2-1
  132.  
  133. # visit center
  134. Index(0,0,0,0).visit()
  135.  
  136. # Side growing nodes
  137. PlusI = []
  138. MinusI = []
  139. PlusJ = []
  140. MinusJ = []
  141.  
  142. # Main growing nodes
  143. MainPlusI = []
  144. MainMinusI = []
  145. MainPlusJ = []
  146. MainMinusJ = []
  147. MainPlusK = []
  148. MainMinusK = []
  149.  
  150. if halfA > 0:
  151. MainPlusI.append( Index(+1, 0, 0, halfA) )
  152. MainPlusJ.append( Index(0, +1, 0, halfA) )
  153. MainPlusK.append( Index(0, 0, +1, halfA) )
  154.  
  155. if halfB > 0:
  156. MainMinusI.append( Index(-1, 0, 0, halfB) )
  157. MainMinusJ.append( Index(0, -1, 0, halfB) )
  158. MainMinusK.append( Index(0, 0, -1, halfB) )
  159.  
  160. visited = True
  161. while visited:
  162. visited = False
  163.  
  164. # visit all main nodes
  165. for m in MainPlusI:
  166. m.visit()
  167. visited = True
  168. for m in MainMinusI:
  169. m.visit()
  170. visited = True
  171. for m in MainPlusJ:
  172. m.visit()
  173. visited = True
  174. for m in MainMinusJ:
  175. m.visit()
  176. visited = True
  177. for m in MainPlusK:
  178. m.visit()
  179. visited = True
  180. for m in MainMinusK:
  181. m.visit()
  182. visited = True
  183.  
  184. # visit all side nodes
  185. for m in PlusI:
  186. m.visit()
  187. visited = True
  188. for m in MinusI:
  189. m.visit()
  190. visited = True
  191. for m in PlusJ:
  192. m.visit()
  193. visited = True
  194. for m in MinusJ:
  195. m.visit()
  196. visited = True
  197.  
  198. PlusI = StepPlusI(PlusI)
  199. MinusI = StepMinusI(MinusI)
  200. PlusJ = StepPlusJ(PlusJ)
  201. MinusJ = StepMinusJ(MinusJ)
  202.  
  203. MainPlusI = StepMainPlusI(MainPlusI, MinusJ, halfB)
  204. MainMinusJ = StepMainMinusJ(MainMinusJ, MinusI, halfB)
  205. MainMinusI = StepMainMinusI(MainMinusI, PlusJ, halfA)
  206. MainPlusJ = StepMainPlusJ(MainPlusJ, PlusI, halfA)
  207.  
  208. MainPlusK = StepMainPlusK(MainPlusK, MainPlusI, MainMinusI, MainPlusJ, MainMinusJ, halfA, halfB)
  209. MainMinusK = StepMainMinusK(MainMinusK, MainPlusI, MainMinusI, MainPlusJ, MainMinusJ, halfA, halfB)
  210.  
  211.  
  212. Traverse(5)
  213.  
  214.  
Success #stdin #stdout 0.01s 9016KB
stdin
Standard input is empty
stdout
[0, 0, 0]
[1, 0, 0]
[-1, 0, 0]
[0, 1, 0]
[0, -1, 0]
[0, 0, 1]
[0, 0, -1]
[2, 0, 0]
[1, 0, 1]
[1, 0, -1]
[-2, 0, 0]
[-1, 0, 1]
[-1, 0, -1]
[0, 2, 0]
[0, 1, 1]
[0, 1, -1]
[0, -2, 0]
[0, -1, 1]
[0, -1, -1]
[0, 0, 2]
[0, 0, -2]
[1, 1, 0]
[-1, -1, 0]
[-1, 1, 0]
[1, -1, 0]
[2, 0, 1]
[2, 0, -1]
[1, 0, 2]
[1, 0, -2]
[-2, 0, 1]
[-2, 0, -1]
[-1, 0, 2]
[-1, 0, -2]
[0, 2, 1]
[0, 2, -1]
[0, 1, 2]
[0, 1, -2]
[0, -2, 1]
[0, -2, -1]
[0, -1, 2]
[0, -1, -2]
[2, 1, 0]
[1, 2, 0]
[1, 1, 1]
[1, 1, -1]
[-2, -1, 0]
[-1, -2, 0]
[-1, -1, 1]
[-1, -1, -1]
[-1, 2, 0]
[-2, 1, 0]
[-1, 1, 1]
[-1, 1, -1]
[1, -2, 0]
[2, -1, 0]
[1, -1, 1]
[1, -1, -1]
[2, 0, 2]
[2, 0, -2]
[-2, 0, 2]
[-2, 0, -2]
[0, 2, 2]
[0, 2, -2]
[0, -2, 2]
[0, -2, -2]
[2, 2, 0]
[2, 1, 1]
[2, 1, -1]
[1, 2, 1]
[1, 2, -1]
[1, 1, 2]
[1, 1, -2]
[-2, -2, 0]
[-2, -1, 1]
[-2, -1, -1]
[-1, -2, 1]
[-1, -2, -1]
[-1, -1, 2]
[-1, -1, -2]
[-2, 2, 0]
[-1, 2, 1]
[-1, 2, -1]
[-2, 1, 1]
[-2, 1, -1]
[-1, 1, 2]
[-1, 1, -2]
[2, -2, 0]
[1, -2, 1]
[1, -2, -1]
[2, -1, 1]
[2, -1, -1]
[1, -1, 2]
[1, -1, -2]
[2, 2, 1]
[2, 2, -1]
[2, 1, 2]
[2, 1, -2]
[1, 2, 2]
[1, 2, -2]
[-2, -2, 1]
[-2, -2, -1]
[-2, -1, 2]
[-2, -1, -2]
[-1, -2, 2]
[-1, -2, -2]
[-2, 2, 1]
[-2, 2, -1]
[-1, 2, 2]
[-1, 2, -2]
[-2, 1, 2]
[-2, 1, -2]
[2, -2, 1]
[2, -2, -1]
[1, -2, 2]
[1, -2, -2]
[2, -1, 2]
[2, -1, -2]
[2, 2, 2]
[2, 2, -2]
[-2, -2, 2]
[-2, -2, -2]
[-2, 2, 2]
[-2, 2, -2]
[2, -2, 2]
[2, -2, -2]