hdu1181变形课dfs/bfs/并查集三种解法(java)
題目鏈接
Problem Description
呃…變形課上Harry碰到了一點小麻煩,因為他并不像Hermione那樣能夠記住所有的咒語而隨意的將一個棒球變成刺猬什么的,但是他發現了變形咒語的一個統一規律:如果咒語是以a開頭b結尾的一個單詞,那么它的作用就恰好是使A物體變成B物體.
Harry已經將他所會的所有咒語都列成了一個表,他想讓你幫忙計算一下他是否能完成老師的作業,將一個B(ball)變成一個M(Mouse),你知道,如果他自己不能完成的話,他就只好向Hermione請教,并且被迫聽一大堆好好學習的道理.
Input
測試數據有多組。每組有多行,每行一個單詞,僅包括小寫字母,是Harry所會的所有咒語.數字0表示一組輸入結束.
Output
如果Harry可以完成他的作業,就輸出"Yes.",否則就輸出"No."(不要忽略了句號)
Sample Input
so
soon
river
goes
them
got
moon
begin
big
0
Sample Output
Yes.
Hint
Hint
Harry 可以念這個咒語:“big-got-them”.
首先這是一題水題。但是題目比較靈活,解題思路較多,溫習下各種算法的實現。
并查集:
- 這題因為是查找最終的關系,所以可以用并查集來處理對象的關系,進行查找合并,最終查看b點是否為m點的父親。這合并的過程要注意不能壓縮路徑,并且m點不做父節點。因為m是根節點防止m成為父節點造成關系混亂。
dfs:
- 可以用list[]數組作為靈界表儲存各個節點信息,因為節點都是’a’-'z’的節點,所以可以直接深搜。
bfs:
- 這題bfs也可以,用隊列添加m(12),從m點開始遍歷找到’b’點,輸出結果。
注意點:
輸入多組數據,不僅僅是一項到0多組數據,到0輸出后還有初始化參數完成下一輪,也就是這題理論是沒有輸入結束狀態的!wa了好久因為這個。
并查集:
import java.util.Scanner;public class 杭電1181并查集 {static int a[];//儲藏父節點public static void main(String[] args) {// TODO 自動生成的方法存根 Scanner sc=new Scanner(System.in);init();while(sc.hasNext()){String str=sc.next();if(str.equals("0")) {int index=a[12];if(a[12]==-1) {System.out.println("No.");}//m這個點沒有父親else{int value=search(12);if(value==1) {System.out.println("Yes.");}else System.out.println("No.");}init();}else{int start=str.charAt(0)-'a';int end=str.charAt(str.length()-1)-'a';join(start, end);}}}static void init() {a=new int[26];for(int i=0;i<26;i ){a[i]=-1;}}static int search(int i)//查找父節點編號 {if(a[i]==-1)return i;else return search(a[i]);}static void join(int b1,int b2)//b1<-b2 b1為父親{int a1=search(b1);//b1父節點int a2=search(b2);//b2 父節點if(a1==a2) {}//已經在一棵樹上 else if(a1==12) {}//m點不做任何點的父節點,他是最底層的根節點else if(a2==1){}//b不做兒子,只做父親,不然m點最上父節點可能是b爸爸else {a[a2]=a1;}} }dfs:
import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class 杭電1181dfs {static boolean judgle=false;public static void main(String[] args) {// TODO 自動生成的方法存根Scanner sc=new Scanner(System.in);Listlist[]=new ArrayList[26];for(int i=0;i<26;i ){list[i]=new ArrayList<>();}boolean jud[]=new boolean[26];while(sc.hasNext()){String str=sc.nextLine();if(str.equals("0")) {dfs(list,1,jud);if(judgle) {System.out.println("Yes.");}else System.out.println("No.");//初始化參數judgle=false;jud=new boolean[26];for(int i=0;i<26;i ){list[i]=new ArrayList<>();}}else {char font=str.charAt(0);char end=str.charAt(str.length()-1);if(font!=end)list[(int)(font-'a')].add((int)(end-'a')); }}}private static void dfs(List[] list, int i, boolean[] jud) {// TODO 自動生成的方法存根if(i==12) {judgle=true;}if(!judgle){for(int j=0;j>map=new HashMap<>();while(sc.hasNext()){String s=sc.nextLine();if(s.equals("0")){Queue q1=new ArrayDeque<>();if(!map.containsKey("b")) {System.out.println("No.");}else{Set jud=new HashSet<>();q1.add("b");jud.add("b");boolean j=false;while(!q1.isEmpty()){String node=q1.poll();if(node.equals("m")){System.out.println("Yes.");j=true;break;}else{if(map.containsKey(node)){Set set2=map.get(node);for(String team:set2){if(jud.contains(team)) {continue;}else{jud.add(team);q1.add(team);}}}}}if(!j) {System.out.println("No.");}}map.clear();}String start=s.substring(0, 1);String end=s.substring(s.length()-1);if(map.containsKey(start)) {Set set2=map.get(start);set2.add(end); map.put(start, set2);}else {Set set=new HashSet<>();set.add(end);map.put(start, set);}} } }list套數組法:
import java.util.ArrayDeque; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.Scanner; public class 杭電11811 {public static void main(String[] args) {// TODO 自動生成的方法存根Scanner sc=new Scanner(System.in);Listlist[]=new ArrayList[26];for(int i=0;i<26;i ){list[i]=new ArrayList<>();}boolean jud[]=new boolean[26];while(sc.hasNext()){String str=sc.nextLine();if(str.equals("0"))//b m 1 11{ Queueq1=new ArrayDeque<>();q1.add(1);jud[1]=true;boolean bool=false;while(!q1.isEmpty()){int team=q1.poll();if(team==12) {System.out.println("Yes.");bool=true;break;}else{for(int j=0;j();}jud=new boolean[26];}else {char font=str.charAt(0);char end=str.charAt(str.length()-1);if(font!=end)list[(int)(font-'a')].add((int)(end-'a')); }}} }水平有限,如果有錯,還請大佬指正。
- 如果對后端、爬蟲、數據結構算法等感性趣歡迎關注我的個人公眾號交流:bigsai
總結
以上是生活随笔為你收集整理的hdu1181变形课dfs/bfs/并查集三种解法(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj3061尺取法/前缀和 二分(ja
- 下一篇: poj3320Jessica's Rea