历届试题 青蛙跳杯子-(bfs)
题目:http://lx.lanqiao.cn/problem.page?gpid=T448
题意:有两个字符串例如*WWBB和WWBB*,*每次能往左或右跳1-3步,与原位置的字符交换,问最少步数跳到第二个字符串的状态。
bfs裸题,C++能秒杀,改用java做题倒是折腾了挺久,测试了HashMap和LinkedList的用法,第一次提交超时,看别人代码后修正。
import java.util.HashMap; import java.util.LinkedList; import java.util.Scanner; public class Main{ public static void main(String[] args) { LinkedList<Node> que=new LinkedList<Node>(); HashMap<String, Integer> map=new HashMap<String, Integer>(); Scanner scan=new Scanner(System.in); String s1=scan.next(); String s2=scan.next(); int len=s1.length(); map.put(s1, 0); int ans=0; Node start=new Node(); start.s=s1;start.x=s1.indexOf("*");start.t=0; que.add(start); while(!que.isEmpty()) { Node now=que.getFirst(); String nows=now.s; que.pop(); int nowx=now.x;//此时*的位置,准备跳到xx的位置 if(nows.equals(s2)) { ans=now.t; break; } for(int i=-3;i<=3;i++){//6种跳法 int xx=nowx+i;//xx是*要跳到的下标的位置 if(i!=0 && xx>=0 && xx<len) {//判断不越界 String next; char c[]=nows.toCharArray();//用char数组转换满分过,484ms c[nowx]=c[xx]; c[xx]=nows.charAt(nowx); next=new String(c); /* String指定字符交换部分的代码,超时83分。 if(i<0) {//*往左移动 if(nowx==(len-1))//*在最右边 next=nows.substring(0, xx)+"*"+nows.substring(xx+1,nowx)+temp; else next=nows.substring(0, xx)+"*"+nows.substring(xx+1,nowx)+temp+nows.substring(nowx+1,len); }else {//*往右跳移动 if(xx==(len-1))//跳到最右边 next=nows.substring(0,nowx)+temp+nows.substring(nowx+1, xx)+"*"; else next=nows.substring(0,nowx)+temp+nows.substring(nowx+1, xx)+"*"+nows.substring(xx+1,len); }*/ if(map.containsKey(next)==false) {//没有跳到此状态过 map.put(next, 1);//标记 Node node=new Node(); node.s=next; node.x=xx; node.t=now.t+1; que.add(node); } } } } System.out.println(ans); } } class Node{ String s; int x;//* 的位置 int t;//步数 }