題目描述
已知有兩個字串A,B,B,B及一組字串變換的規則(至多6個規則):
A1$ -> B1$
A2$ -> B2$
規則的含義為:在 A中的子串A1中的子串A1中的子串A1可以變換為B1、A2、A2、A2可以變換為B2$…
例如:A=′abcd′ B='abcd' B=′abcd′ B=’xyz’
變換規則為:
‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’
則此時,A可以經過一系列的變換變為B可以經過一系列的變換變為B可以經過一系列的變換變為B,其變換的過程為:
‘abcd’->‘xud’->‘xy’->‘xyz’
共進行了三次變換,使得A變換為B變換為B變換為B。
- 輸入
一組測試資料,每組輸入的第一行輸入兩個字串A和B和B和B。
接下來若干行輸入變換規則:
A$ B$
A1$ B1$
A2$ B2$ |-> 變換規則
… … /
所有字串長度的上限為 20。 - 輸出
對於每組輸入資料,若在10步(包含10步)以內能將A變換為B變換為B變換為B,則輸出最少的變換步數,否則輸出"NO ANSWER!"。
樣例輸入
abcd xyz
abc xu
ud y
y yz
樣例輸出
3
bfs搜尋,將所有變換儲存,找到替換規則符合進行替換,並記錄當前變換次數。
這裡給出java的AC程式碼給大家參考
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<String, ArrayList<String>> hm = new HashMap<>();
String beg = sc.next();
String end = sc.next();
HashSet<String> use = new HashSet<>();
while (sc.hasNext()) {
String a = sc.next();
String b = sc.next();
ArrayList<String> al = hm.get(a);
if (al != null) {
al.add(b);
} else {
ArrayList<String> te = new ArrayList<>();
te.add(b);
hm.put(a, te);
}
}
Set<String> hs = hm.keySet();
Queue<String> q = new LinkedList<>();
q.add(beg);
use.add(beg);
int ci = 0;
int next = 0;
int now = 1;
boolean flag = false;
while (!q.isEmpty()) {
String s = q.poll();
now--;
if (s.equals(end)) {
flag = true;
break;
}
for (String str : hs) {
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == str.charAt(0)) {
boolean test = true;
for (int j = 0; j < str.length(); j++) {
if (i+j>=s.length()||s.charAt(i + j) != str.charAt(j)) {
test = false;
}
}
if (test) {
ArrayList<String> re = hm.get(str);
for (String string : re) {
String temp = s.substring(0, i) + string + s.substring(i + str.length(), s.length());
if(!use.contains(temp)) {
q.add(temp);
use.add(temp);
next++;
}
}
}
}
}
}
if (now <= 0) {
now = next;
ci++;
if (ci > 10) {
break;
}
next = 0;
}
}
if (flag) {
System.out.print(ci);
} else {
System.out.print("NO ANSWER!");
}
}
}