题目链接:https://www.luogu.org/problem/P1032
思路:
采用BFS
我们遍历字符串a的每个字符,判断当前字符串i位置之后可不可以替换,如果可以替换,我们就把替换后的字符串 a' 放入队列。
如果出现的我们想要的字符串,根据BFS的性质,那么就直接记录此时的步数。
1 #include <math.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <iostream> 5 #include <algorithm> 6 #include <string> 7 #include <string.h> 8 #include <vector> 9 #include <map> 10 #include <stack> 11 #include <set> 12 #include <queue> 13 14 15 #define LL long long 16 #define INF 0x3f3f3f3f 17 #define ls nod<<1 18 #define rs (nod<<1)+1 19 const int maxn = 20; 20 const double eps = 1e-9; 21 22 struct Node { 23 std::string str; 24 int step; 25 }; 26 27 int cnt,n; 28 29 std::string a,b; 30 std::string ori[maxn],trans[maxn]; 31 std::map<std::string,int> mp; 32 33 std::string tra(std::string str,int i,int j) { 34 std::string ans = ""; 35 if (i+ori[j].length() > str.length()) { // 说明后面没有ori[j].length()的长度的字符 36 return ans; 37 } 38 for (int k=0;k<ori[j].length();k++) { 39 if (str[i+k] != ori[j][k]) { 40 return ans; 41 } 42 } 43 ans = str.substr(0,i); 44 ans += trans[j]; 45 ans += str.substr(i+ori[j].length()); 46 return ans; 47 } 48 49 void bfs() { 50 std::queue<Node> q; 51 Node st; 52 st.step = 0; 53 st.str = a; 54 q.push(st); 55 while (!q.empty()) { 56 Node ed = q.front(); 57 q.pop(); 58 std::string temp; 59 if (mp.count(ed.str) == 1) { 60 continue; 61 } 62 if (ed.str == b) { 63 cnt = ed.step; 64 break; 65 } 66 mp[ed.str] = 1; 67 for (int i=0;i<ed.str.length();i++) { 68 for (int j=0;j<n;j++) { 69 temp = tra(ed.str,i,j); 70 if (temp != "") { 71 Node u; 72 u.str = temp; 73 u.step = ed.step + 1; 74 q.push(u); 75 } 76 } 77 } 78 } 79 if (cnt > 10 || cnt == 0) { 80 printf("NO ANSWER!\n"); 81 } 82 else 83 printf("%d\n",cnt); 84 } 85 86 int main() { 87 //freopen("../in.txt","r",stdin); 88 std::cin >> a >> b; 89 while (std::cin >> ori[n] >> trans[n]) 90 n++; 91 bfs(); 92 return 0; 93 }