考虑你从家出发步行去往一处目的地,该目的地恰好离你整数单位步长(大于等于1)。你只能朝向该目的地或者背向该目的地行走,而你行走的必须为单位步长的整数倍,且要求你第N次行走必须走N步。
请就给出目的地离你距离,判断你是否可以在有限步内到达该目的地。如果可以到达的话,请计算到达目的地的最短总步数(不能到达则输出-1)。
1个整数:目的地离你距离T
1个整数:最短总步数(进行了多少次行走)
2
3
距离目的地2, 需要3步:朝向走1,背向走2,朝向走3
i
两个选项,将其结果送到队列中。 N
的话,就再也不会走到指定的位置了。 from collections import deque N = int(input()) que = deque([(0,1)]) while que: # 标记当前层是不是还有小于N的值 SMALLER = False for _ in range(len(que)): cur_pos,step = que.popleft() if cur_pos == N: print(step-1) exit() if cur_pos+ step <= N: SMALLER = True que.append([cur_pos+step,step+1]) que.append([cur_pos-step,step+1]) if not SMALLER: print(-1) break
""" 广度优先遍历算法 [0] 第0层, [1, -1] 第1层,上层的结果 +1,-1 [3, -1, 1, -3] 第2层,上层的结果 +2,-2 ... 第i层,上层的结果 +i,-i """ def BFS(n): bfs = set([0]) i = 0 while True: i += 1 pre = bfs.copy() bfs = set() for num in pre: if num+i==n or num-i==n: return i else: bfs.add(num+i) bfs.add(num-i) n = int(input()) print(BFS(n))