青蛙跳杯子 java实现

这个Java程序采用HashMap存储已访问状态,ArrayDeque进行广度优先搜索,寻找从源字符串`s`到目标字符串`e`的最短转换步数。每个节点包含字符串状态和步数,通过查找字符串中的'*'并替换相邻字符来探索可能的转换路径。程序在字符串判等时注意使用`equals`而非`==`,确保正确性。
摘要由CSDN通过智能技术生成

运用 HashMap + ArrayDeque + StringBuilder

import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.Scanner;

class node{
	String s;
	int step;
}
 
public class Main {
	static String s,e;
    public static void main(String[] args) {
    	Scanner sc=new Scanner(System.in);
    	while(sc.hasNext())
    	{
    		HashMap<String, Integer> m=new HashMap<String, Integer>();
    		s=sc.next();
    		e=sc.next();
    		node p=new node();
    		p.s=s;
    		p.step=0;
    		ArrayDeque<node> q=new ArrayDeque<node>();
    		q.offer(p);
    		m.put(s, 1);
    		int flag=0;
    		while(!q.isEmpty())
    		{
    			node u=q.peek();
    			if(u.s.equals(e)) //注意java的字符串判等不能是==,而是equals
    			{
    				System.out.println(u.step);
    			}
    			q.pop();
    			int d=u.s.indexOf("*"); //先找到*的位置
    			//下面是判断所有可能跳的位置
    			if(d-1>=0) 
    			{
    				//替换一个字符串中的两个字符用的是StringBuilder中的replace(start,end,str);
    				StringBuilder s=new StringBuilder();
    				s.append(u.s);
    				char ch=s.charAt(d);
    				s.replace(d, d+1, s.charAt(d-1)+"");
    				s.replace(d-1, d, ch+"");
    				if(!m.containsKey(s.toString())) //利用HashMap保证已经到达过的点不会再到达
    				{
    					m.put(s.toString(), 1);
    					node pp=new node(); //java这里要new,申请空间
    					pp.s=s.toString(); //StringBuilder转String
    					pp.step=u.step+1;
    					q.offer(pp);
    				}
    			}
    			if(d-2>=0)
    			{
    				StringBuilder s=new StringBuilder();
    				s.append(u.s);
    				char ch=s.charAt(d);
    				s.replace(d, d+1, s.charAt(d-2)+"");
    				s.replace(d-2, d-1, ch+"");
    				if(!m.containsKey(s.toString()))
    				{
    					m.put(s.toString(), 1);
    					node pp=new node();
    					pp.s=s.toString();
    					pp.step=u.step+1;
    					q.offer(pp);
    				}
    			}
    			if(d-3>=0)
    			{
    				StringBuilder s=new StringBuilder();
    				s.append(u.s);
    				char ch=s.charAt(d);
    				s.replace(d, d+1, s.charAt(d-3)+"");
    				s.replace(d-3, d-2, ch+"");
    				if(!m.containsKey(s.toString()))
    				{
    					m.put(s.toString(), 1);
    					node pp=new node();
    					pp.s=s.toString();
    					pp.step=u.step+1;
    					q.offer(pp);
    				}
    			}
    			if(d+1<u.s.length())
    			{
    				StringBuilder s=new StringBuilder();
    				s.append(u.s);
    				char ch=s.charAt(d);
    				s.replace(d, d+1, s.charAt(d+1)+"");
    				s.replace(d+1, d+2, ch+"");
    				if(!m.containsKey(s.toString()))
    				{
    					m.put(s.toString(), 1);
    					node pp=new node();
    					pp.s=s.toString();
    					pp.step=u.step+1;
    					q.offer(pp);
    				}
    			}
    			if(d+2<u.s.length())
    			{
    				StringBuilder s=new StringBuilder();
    				s.append(u.s);
    				char ch=s.charAt(d);
    				s.replace(d, d+1, s.charAt(d+2)+"");
    				s.replace(d+2, d+3, ch+"");
    				if(!m.containsKey(s.toString()))
    				{
    					m.put(s.toString(), 1);
    					node pp=new node();
    					pp.s=s.toString();
    					pp.step=u.step+1;
    					q.offer(pp);
    				}
    			}
    			if(d+3<u.s.length())
    			{
    				StringBuilder s=new StringBuilder();
    				s.append(u.s);
    				char ch=s.charAt(d);
    				s.replace(d, d+1, s.charAt(d+3)+"");
    				s.replace(d+3, d+4, ch+"");
    				if(!m.containsKey(s.toString()))
    				{
    					m.put(s.toString(), 1);
    					node pp=new node();
    					pp.s=s.toString();
    					pp.step=u.step+1;
    					q.offer(pp);
    				}
    			}
    		}
    	}
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henulmh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值