刷题 BFS 广度优先算法 : 一步之遥 (python, java)

刷题 BFS 广度优先算法 : 一步之遥 (python, java)

https://www.lanqiao.cn/problems/652/learning/

在这里插入图片描述

答案: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++;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值