螺旋數字的算法簡單實現。
示例 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*stepsdef 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] = curSeeddef 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):
新聞熱點
疑難解答