當(dāng)前位置:
首頁 >
2017蓝桥杯省赛---java---C---9(青蛙跳杯子)
發(fā)布時(shí)間:2023/12/3
50
豆豆
生活随笔
收集整理的這篇文章主要介紹了
2017蓝桥杯省赛---java---C---9(青蛙跳杯子)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
題目描述 X星球的流行寵物是青蛙,一般有兩種顏色:白色和黑色。X星球的居民喜歡把它們放在一排茶杯里,這樣可以觀察它們跳來跳去。如下圖,有一排杯子,左邊的一個(gè)是空著的,右邊的杯子,每個(gè)里邊有一只青蛙。*WWWBBB其中,W字母表示白色青蛙,B表示黑色青蛙,*表示空杯子。X星的青蛙很有些癖好,它們只做3個(gè)動(dòng)作之一:1. 跳到相鄰的空杯子里。2. 隔著1只其它的青蛙(隨便什么顏色)跳到空杯子里。3. 隔著2只其它的青蛙(隨便什么顏色)跳到空杯子里。對(duì)于上圖的局面,只要1步,就可跳成下圖局面:WWW*BBB本題的任務(wù)就是已知初始局面,詢問至少需要幾步,才能跳成另一個(gè)目標(biāo)局面。輸入為2行,2個(gè)串,表示初始局面和目標(biāo)局面。 輸出要求為一個(gè)整數(shù),表示至少需要多少步的青蛙跳。例如: 輸入: *WWBB WWBB*則程序應(yīng)該輸出: 2再例如, 輸入: WWW*BBB BBB*WWW則程序應(yīng)該輸出: 10我們約定,輸入的串的長度不超過15資源約定: 峰值內(nèi)存消耗(含虛擬機(jī)) < 256M CPU消耗 < 1000ms請嚴(yán)格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內(nèi)容。所有代碼放在同一個(gè)源文件中,調(diào)試通過后,拷貝提交該源碼。 不要使用package語句。不要使用jdk1.7及以上版本的特性。 主類的名字必須是:Main,否則按無效代碼處理。----------------------------笨笨有話說:我夢見自己是一棵大樹,青蛙跳躍,我就發(fā)出新的枝條,春風(fēng)拂動(dòng)那第 5 層的新枝,哦,我已是枝繁葉茂。思路分析
bfs
代碼實(shí)現(xiàn)
package lanqiao;import java.util.*;public class Main {private static StringBuilder start;private static StringBuilder target;static Set<String> allState=new HashSet<String>();/*** 封裝一個(gè)持有狀態(tài)和層次的類*/private static class StateAndLevel{StringBuilder state;int level;int pos;//空杯子的位置public StateAndLevel(StringBuilder state, int level,int pos) {this.state = state;this.level = level;//走的步數(shù)this.pos=pos;}@Overridepublic int hashCode() {return state!=null?state.hashCode():0;}@Overridepublic boolean equals(Object o) {if(this==o) return true;if(o==null||getClass()!=o.getClass()) return false;StateAndLevel thar = (StateAndLevel) o;return state!=null?state.toString().equals(thar.state.toString()):thar.state==null;}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);start = new StringBuilder(scanner.nextLine());target = new StringBuilder(scanner.nextLine());bfs();}private static void bfs() {/*初始狀態(tài)加入隊(duì)列*/Queue<StateAndLevel> q=new LinkedList<>();q.add(new StateAndLevel(start, 0, start.indexOf("*")));allState.add(start.toString());/*不定的彈出對(duì)手,一步煙花成相鄰狀態(tài),加入隊(duì)列(判重)*/while (!q.isEmpty()){StateAndLevel front = q.poll();StringBuilder state = front.state;int level = front.level;//和 目標(biāo)值作比較if (state.toString().equals(target.toString())){System.out.println(level);break;}int pos = front.pos;//可以演化出若干種相鄰的狀態(tài)for (int i = -3; i <= 3; i++) {if(i==0) continue;if(pos+i>=0&&pos+i<state.length()){StringBuilder new_state = new StringBuilder(state);swap(new_state,pos,pos+i);//交換達(dá)到新狀態(tài)if (!allState.contains(new_state)){q.add(new StateAndLevel(new_state, level + 1, pos + i));allState.add(new_state.toString());//放入set}}}}}public static void swap(StringBuilder a,int i,int j){char t=a.charAt(i);a.setCharAt(i,a.charAt(j));a.setCharAt(j,t);}}總結(jié)
以上是生活随笔為你收集整理的2017蓝桥杯省赛---java---C---9(青蛙跳杯子)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏枪神要求配置要多少?
- 下一篇: 2020蓝桥杯省赛---java---A