螺旋数字的算法简单实现。python
示例 5算法
01 02 03 04 05app
16 17 18 19 06oop
15 24 25 20 07测试
14 23 22 21 08spa
13 12 11 10 09 orm
经过观察,外部数字进行环绕一圈后向内收拢。对象
从程序出发,只要递归处理好4条边便可。blog
同时为了不顶点重复赋值,最后一个点让后续的边处理。递归
说明:处理暂时存储在一个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")