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