刷题 BFS 广度优先算法 : 一步之遥 (python, java)
答案:
97
Python
# 全局变量
# 记录正方向经过的距离,因为是通过下标判断距离是否经过了,所以长度要设置大一些
visita = [False for _ in range(100000)]
visitb = [False for _ in range(100000)]
FB = [97, -127]
def BFS(queue):
count = 1 # 计数,前面已经走一步了
while len(queue) != 0:
size = len(queue)
while size > 0:
size -= 1 # 次数减1
curr = queue.pop(0) # 返回并删除第一个值
# 结束条件
if curr == 1:
return count
# 遍历路径
for i in FB:
new_val = curr + i
# 验证是否已经经过
if new_val >= 0:
if not visita[new_val]:
queue.append(new_val)
visita[new_val] = True
else:
if not visitb[abs(new_val)]:
queue.append(new_val)
visitb[abs(new_val)] = True
# 计数
count += 1
if __name__=="__main__":
# 初始值,即第一次按按钮得到的结果
# print("hello")
queue = [97, -127]
visita[97] = True
visitb[127] = True
count = BFS(queue)
print(count) # 97
Java
import java.util.LinkedList;
import java.util.Queue;
public class 蓝桥95一步之遥 {
//
public static void main(String[] args) {
boolean[] visita = new boolean[1000000]; // 正
boolean[] visitb = new boolean[1000000]; //负
Queue<Integer> queue = new LinkedList<>();
queue.offer(97);
queue.offer(-127); // 添加到队列尾部
//
int time =1; // 前面已经走了一步
while (!queue.isEmpty()) {
int size = queue.size();
while (size-- > 0) {
int curr = queue.poll(); //取队列的第一个值
if (curr== 1) {
System.out.println(time); //97
return;
}
// +97路径
if (curr+97 > 0) {
if (visita[curr+97] == false) {
visita[curr+97]=true;
queue.offer(curr+97);
}
} else {
int t = -(curr+97);
if (visitb[t] == false) {
visitb[t] = true;
queue.offer(curr+97);
}
}
// -127 路径
if (curr-127 > 0) {
if (visita[curr-127]==false) {
visita[curr-127]=true;
queue.offer(curr-127);
}
}else {
int t2 = -(curr-127);
if (visitb[t2] == false) {
visitb[t2]=true;
queue.offer(curr-127);
}
}
}
// 步数增加
time++;
}
}
}