更多JAVA版答案移步我的博客:蓝桥杯JAVA版答案汇总
本题考查
广搜、(剪枝)
思路
广搜思路:将每一次广搜出队的情况进行该情况所有可能性的推导,将合理情况加入队列中,不断循环,直到找到结果情况
每一次出队的情况中对于每只青蛙都有如下可能性:
- 向左跳3
- 向左跳2
- 向左跳1
- 向右跳1
- 向右跳2
- 向右跳3
以上六种情况并不是所有情况都符合条件,当然如果你不考虑运行速度的话,可以不用判断,但既然是考算法题,还是尽量减少运行时间,需要对某些情况进行剪枝:
- 当前位置不是青蛙,不合法
- 要去往的位置不是空,不合法
- 要去往的位置越界,不合法
对上述情况进行剪枝后,能够相对明显的去除掉一些不合法的情况,能缩短运行时间。
AC代码
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
static class Node{
String s;
int level;
public Node(String s, int level) {
this.s = s;
this.level = level;
}
}
static int BFS(String ori, String result) {
int bfsResult = 0;
HashMap<String, Integer> map = new HashMap<String, Integer>();
LinkedList<Node> list = new LinkedList<Node>();
list.add(new Node(ori, 0)); map.put(ori, 1);//初始化广搜两个重要存储结构
while(list.size() > 0) {
Node temp = list.pop();
if(temp.s.equals(result)) {bfsResult = temp.level; break;}//循环结束的条件
for(int i = 0; i < temp.s.length(); i++)
for(int j = -3; j <= 3; j++){
char[] charArr = temp.s.toCharArray();
if(i+j>=0&&i+j<temp.s.length()&&charArr[i]!='*'&&charArr[i+j]=='*') {
charArr[i+j] = charArr[i];
charArr[i] = '*';
String newStr = new String(charArr);
if(!map.containsKey(newStr)) {
map.put(newStr, 1);
list.add(new Node(newStr, temp.level+1));
}
}
}
}
return bfsResult;
}
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
String ori = scaner.nextLine();
String result = scaner.nextLine();
scaner.close();
System.out.println(BFS(ori, result));
}
}