螺旋数字的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 

通过观察,外部数字进行环绕一圈后向内收拢。

num-1

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

num-2

同时为了避免顶点重复赋值,最后一个点让后续的边处理。

 

说明:处理暂时存储在一个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[loc_index] = 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[rowIndex])
       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")

  

posted on 2015-07-14 11:47  febwave  阅读(1575)  评论(0编辑  收藏  举报

导航