zoukankan      html  css  js  c++  java
  • 螺旋数字的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
    ' % (outBuffer))              
                         outBuffer = ''
                  outBuffer = outBuffer + '%02d ' %(targetlst[rowIndex])
           print('%s
    ' % (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
    " % ( exc));   
           info = traceback.format_exc()
           print(info)            
    print("done")
    

      

  • 相关阅读:
    关于prototype属性的理解
    关于js中原型链的理解
    关于焦点轮播图的优化
    两个动画函数的分析
    JavaScript 实用技巧和写法建议
    Vue SPA 首屏加载优化实践
    带你优雅的使用 icon
    前端本地文件操作与上传
    学习webpack
    Vue 脱坑记
  • 原文地址:https://www.cnblogs.com/febwave/p/4645036.html
Copyright © 2011-2022 走看看