洛谷P1032 字串变换-题解

https://www.luogu.org/problemnew/show/P1032--(题目传送)

好在数据范围很小,暴力一点也能过。思路较简单,按照所有规则,从第一位开始广搜。

注意:1.strcpy可能会造成内存溢出。2.字符串被调用/初始化前对它求长度无意义(会产生奇妙的反应)

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<map>
 6 using namespace std;
 7 map<string,int>ma;
 8 struct mem {
 9     char s[22];
10     int step;
11 } a,head;
12 queue<mem>q;
13 char to[22],sta[7][22],ls[7],end[7][22],le[7];
14 int i;
15 char s[22];
16 int main() {
17 //  freopen("testdata(1).in","r",stdin);
18     cin>>a.s>>to;
19     while(cin>>sta[i]>>end[i]) {
20         ls[i]=strlen(sta[i]);
21         le[i]=strlen(end[i]);
22         i++;
23     }
24     i--;
25     if(!strcmp(a.s,to)) {
26         cout<<0;
27         return 0;
28     }
29     q.push(a);
30     ma[a.s]=1;
31     int l;
32     while(!q.empty()) {
33         head=q.front();
34         q.pop();
35         l=strlen(head.s);
36         for(int j=0; j<=i; j++)
37             for(int k=0; k<=l-ls[j]; k++) {
38                 int x=strlen(s);
39                 if((strncmp(head.s+k,sta[j],ls[j])==0))
40                     if((x-ls[j]+le[j])<=20) {
41                         strncpy(s,head.s,k);
42                         strcpy(s+k,end[j]);
43                         strcpy(s+k+le[j],head.s+k+ls[j]);
44                         if(!strcmp(s,to)) {
45                             cout<<head.step+1;
46                             return 0;
47                         }
48                         if(!ma[s]&&head.step<10) {
49                             strcpy(a.s,s);
50                             a.step=head.step+1;
51                             q.push(a);
52                             ma[s]=1;
53                         }
54                     }
55             }
56     }
57     cout<<"NO ANSWER!";
58 //    cout<<endl<<head.s;    //debug
59     return 0;
60 }

 

posted @ 2019-04-21 10:03  千叶繁华  阅读(198)  评论(0编辑  收藏  举报