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