当青训营遇上码上掘金,一篇文章给三个青豆,青豆可以用来换礼物,但是需要写满500个字,其中代码占比不能超过百分之三十。虽然不知道代码好像不算进字符中,但当你使用了代码块之后确实有一定的增加。
第一题是两个小孩想要相遇,就算一个起点,一个终点。 从起点出发可以向前一步或者向后一步,或者坐公交车坐标乘2,但是公交车不能往后开。
因此这道题可以简单使用广度优先搜索。
广度优先搜索模板非常的常见。应该算得上必须是牢记于心的模板。 需要记住几点的有创建一个队列, 初始化元素,起点。 while判断队列非空, 每次出队一个元素, 将这个元素拓展放在队列后。
这里是带轮次的广度优先搜索,因此需要再考虑到一轮for循环,其中for的次数是当时队列大小。需要特别取出来,否则使用q.size()因为队列大小变化出错。
另外一种写法是将index压入队列中,组成一个int[],我认为稍微有一些麻烦,但是在处理某些问题时,比如两个坐标x,y这个时候再加一个又显得方便了。
还有最后一点,获得了正确答案之后直接返回,以获取第一个获取的最优解,如果要获取最后一个就需要加一个全局变量了,不断迭代替换。总体框架不变。
/**
* 支持 import Java 标准库 (JDK 1.8
*/
import java.util.*;
/**
* 注意:目前 Java 代码的入口类名称必须为 Main(大小写敏感)
*/
public class Main {
public static void main(String []args) {
Scanner s = new Scanner(System.in);
int n = 2;
int k = 3;
Queue<Integer> q = new LinkedList<>();
q.offer(n);
int t = 0;
while(!q.isEmpty()){
int size = q.size();
for(int i=0;i<size;i++){
int tmp = q.poll();
if(tmp==k){
System.out.println(t);
return;
}
q.offer(tmp-1);
q.offer(tmp+1);
q.offer(tmp*2);
}
t++;
}
}
}