zoukankan      html  css  js  c++  java
  • 历届试题 青蛙跳杯子-(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;//步数
    }
  • 相关阅读:
    winform编程设定listview选中行
    更新客户信息
    在Flutter中使用Android、iOS的原生 View
    怎么卸载nodejs?
    JavaScript实现简单的图片瀑布流插件
    通过代码重用攻击绕过现代XSS防御
    炫酷的播放粒子效果,你也可以学会!使用Web动画API制作
    14行实现js原生语法前端模板引擎
    什么是ESLint?
    js中require和import的区别
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/11966261.html
Copyright © 2011-2022 走看看