A-Catch That Cow抓住那头牛(BFS)(Java实现)

CSDN是一个让我记录学习的地方,我学习到的东西远远超过我所记录的,11天没有练习算法,让我意识到一个人不可能不停得工作,我告诉自己,一个月可能有一半的时间会浪费在各种各样的情况上,特别是对于一个女程序员,但是如果我能把这道坎跨过去,相信将是无与伦比的风景!算法是找工作的加分项,也是考验我耐力和心态最佳的训练场,希望有一天我能到达那个美好的彼岸世界,祝福我吧——我20岁的四月光景,未来可期不是吗?寻找着属于我的机会。

在这里插入图片描述

在这里插入图片描述
策略1)深度优先搜索:从起点出发, 随机挑一个方向, 能往前走就往前走(扩展),走,不动了则回溯。不能走已经走过的点(要判重)。
1、要想求最优(短)解,则要遍历所有走法。可以用各种手段优化,比如,若已经找到路径长度为n的解,则所有长度大于n的走法就不必尝试。
2、运算过程中需要存储路径上的点,数量较少。用栈存节点。
策略2)广度优先搜索:给节点分层。起点是第0层。从起点最少需n步就能到达的点属于第n层。扩展时,不能扩展出已经走过的节点(要判重)。
1、依层次顺序,从小到大扩展节点。把层次低的点全部扩展出来后,才会扩展层次高的点。
2、可确保找到最优解,但是因扩展出来的节点较多,且多数节点都需要保存,因此需要的存储空间较大。用队列存节点。

算法视频讲解
在这里插入图片描述

学习Java中queue的使用

package 蓝桥杯;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class VO广搜_抓住这头牛 {

	static int N,K;
	static int MAXINT=100000;
	static int[] visit=new int[MAXINT+10];//判重标记,当visit[x][y]=1时表示已经扩展过
	static class step{
		int x;//位置
		int steps;//到达所需的步数
		public step(int x,int steps) {
			this.steps=steps;
			this.x=x;
		}
		public int getX() {
			return x;
		}
		public int getSteps() {
			return steps;
		}
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner reader=new Scanner(System.in);
		N=reader.nextInt();K=reader.nextInt();
		 //add()和remove()方法在失败的时候会抛出异常(不推荐)
        Queue<step> queue = new LinkedList<step>();
        //添加元素
        step steps0=new step(N, 0);
        queue.offer(steps0);
        visit[N]=1;
        while(!queue.isEmpty()) {
        	step s=queue.element();
        	if(s.getX()==K) {
        		System.out.println(s.getSteps());
        		return ;
        	}
        	else {
        		if(s.getX()-1>=0&&visit[s.getX()-1]!=1) {
        			step steps1=new step(s.getX()-1, s.getSteps()+1);
        			queue.offer(steps1);
        			visit[s.getX()-1]=1;
        		}
        		if(s.getX()+1<=MAXINT&&visit[s.getX()+1]!=1) {
        			step steps1=new step(s.getX()+1, s.getSteps()+1);
        			queue.offer(steps1);
        			visit[s.getX()+1]=1;
        		}
        		if(s.getX()*2<=MAXINT&&visit[s.getX()*2]!=1) {
        			step steps1=new step(s.getX()*2, s.getSteps()+1);
        			queue.offer(steps1);
        			visit[s.getX()*2]=1;
        		}
        		queue.poll();
        	}
        }
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值