历届试题 青蛙跳杯子-(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;//步数
}

 

posted @ 2019-12-01 15:41  守林鸟  阅读(635)  评论(2编辑  收藏  举报