CSDN是一个让我记录学习的地方,我学习到的东西远远超过我所记录的,11天没有练习算法,让我意识到一个人不可能不停得工作,我告诉自己,一个月可能有一半的时间会浪费在各种各样的情况上,特别是对于一个女程序员,但是如果我能把这道坎跨过去,相信将是无与伦比的风景!算法是找工作的加分项,也是考验我耐力和心态最佳的训练场,希望有一天我能到达那个美好的彼岸世界,祝福我吧——我20岁的四月光景,未来可期不是吗?寻找着属于我的机会。
策略1)深度优先搜索:从起点出发, 随机挑一个方向, 能往前走就往前走(扩展),走,不动了则回溯。不能走已经走过的点(要判重)。
1、要想求最优(短)解,则要遍历所有走法。可以用各种手段优化,比如,若已经找到路径长度为n的解,则所有长度大于n的走法就不必尝试。
2、运算过程中需要存储路径上的点,数量较少。用栈存节点。
策略2)广度优先搜索:给节点分层。起点是第0层。从起点最少需n步就能到达的点属于第n层。扩展时,不能扩展出已经走过的节点(要判重)。
1、依层次顺序,从小到大扩展节点。把层次低的点全部扩展出来后,才会扩展层次高的点。
2、可确保找到最优解,但是因扩展出来的节点较多,且多数节点都需要保存,因此需要的存储空间较大。用队列存节点。
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();
}
}
}
}