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

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

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

刷题 BFS 广度优先算法 : 一步之遥 (python, java)_第1张图片

答案: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++;
		}
	}
}

你可能感兴趣的:(刷题,java,算法,宽度优先,python)