nosilence 发表于 2015-12-2 13:41:39

螺旋数字的python实现

  螺旋数字的算法简单实现。
  示例 5
  01 02 03 04 05
  16 17 18 19 06
  15 24 25 20 07
  14 23 22 21 08
  13 12 11 10 09
  通过观察,外部数字进行环绕一圈后向内收拢。

  从程序出发,只要递归处理好4条边即可。

  同时为了避免顶点重复赋值,最后一个点让后续的边处理。
  
  说明:处理暂时存储在一个list对象中。
  实现代码:



def getlocIndex(l_x,l_y,steps):      
return l_x+ l_y*steps
def increaseSeedAndSteps(curSeed,cur_steps):
return (curSeed +1,cur_steps+1)

def setTargetItem(targetlst,l_cur_x,l_cur_y,steps,curSeed):
loc_index = getlocIndex(l_cur_x, l_cur_y, steps)
targetlst = curSeed
def calc(targetlst,seed,l_x,l_y,nextsteps,steps):      
current_seed = seed   
loop_steps = nextsteps-1
if( nextsteps < 1 ):            
setTargetItem(targetlst, l_x, l_y,steps, current_seed)            
return

each_steps = 0
while(each_steps <= loop_steps):                                                            
setTargetItem(targetlst, l_x+each_steps, l_y,steps, current_seed)      
current_seed,each_steps = increaseSeedAndSteps(current_seed ,each_steps)

each_steps = 0
while(each_steps <= loop_steps):            
setTargetItem(targetlst, l_x+nextsteps, (l_y+each_steps), steps, current_seed)                  
current_seed,each_steps = increaseSeedAndSteps(current_seed ,each_steps)         

each_steps = 0
while(each_steps <= loop_steps):                                                      
setTargetItem(targetlst, l_x+nextsteps-each_steps, l_y+nextsteps, steps, current_seed)         
current_seed,each_steps = increaseSeedAndSteps(current_seed ,each_steps)            

each_steps = 0
while(each_steps <= loop_steps):                                                      
setTargetItem(targetlst, l_x, l_y+nextsteps-each_steps, steps, current_seed)                        
current_seed,each_steps = increaseSeedAndSteps(current_seed ,each_steps)
if(nextsteps-2 >= 0):
calc(targetlst,current_seed,l_x+1,l_y+1,nextsteps-2,steps)            

  
  
  测试代码:



def outputResult(targetlst,steps):
outBuffer = ''
for rowIndex in range(0, steps* steps):
if(rowIndex % steps == 0 and len(outBuffer) >0):
print('%s\n' % (outBuffer))            
outBuffer = ''
outBuffer = outBuffer + '%02d ' %(targetlst)
print('%s\n' % (outBuffer))               

import traceback
try:
steps =5
targetlst = list()
[ targetlst.append(0) for nTry in range(0,steps* steps)]      
calc(targetlst, 1,0,0,steps-1,steps)
outputResult(targetlst, steps)

except Exception as exc:         
print("app catch: %s\n" % ( exc));   
info = traceback.format_exc()
print(info)            
print("done")

  
页: [1]
查看完整版本: 螺旋数字的python实现