1 条题解
-
0
#include<bits/stdc++.h> using namespace std; struct node { char s[110]; int len, dep, kt; node() { len=dep=0; } } tx[10], ty[10]; deque<node> Q; map<int, bool> v; int kangtuo(node no) //给每个状态一个唯一的编号(康托值) { int sum=0; for(int i=1; i<=no.len; i++) sum=(sum*29+no.s[i])%1000003; return sum; } bool check(node no, int st, int p) //检查 tx中是否有以 st为开头的子串可以用p的方式替换 { for(int i=1; i<=tx[p].len; i++) if(no.s[st+i-1]!=tx[p].s[i]) return 0; return 1; } node change(node no, int st, int p) //x中以st为开头的子串用 p的方式替换 { node tno; int t=0; for(int i=1; i<st; i++) tno.s[++t]=no.s[i]; //拷贝前面的部分 for(int i=1; i<=ty[p].len; i++) tno.s[++t]=ty[p].s[i]; //用ty替代 for(int i=st+tx[p].len; i<=no.len; i++) tno.s[++t]=no.s[i]; //拷贝后面的部分 tno.s[t+1]='\0'; tno.len=t; tno.dep=no.dep+1; tno.kt=kangtuo(tno); return tno; } int main() { node stno, edno; scanf("%s%s", stno.s+1, edno.s+1); stno.len=strlen(stno.s+1); edno.len=strlen(edno.s+1); stno.dep=0; stno.kt=kangtuo(stno); edno.kt=kangtuo(edno); int n; scanf("%d", &n); for(int i=1; i<=n; i++) { scanf("%s%s", tx[i].s+1, ty[i].s+1); tx[i].len=strlen(tx[i].s+1); ty[i].len=strlen(ty[i].s+1); } Q.clear(); Q.push_back(stno); v.clear(); v[stno.kt]=1; //去重 while(!Q.empty()) //开始宽搜 { node no=Q.front(); Q.pop_front(); if(no.dep>=10) break; //不超过10步 for(int i=1; i<=no.len; i++) //枚举no的每个可能被替换的开始位置 { for(int j=1; j<=n; j++) if(i+tx[j].len-1<=no.len) //第j种替换方式 { if(check(no, i, j)) //能替换 { node tno=change(no, i, j); //替换后产生新状态 if(v[tno.kt]==0) { v[tno.kt]=1; Q.push_back(tno); //放入队列中 if(tno.kt==edno.kt) {printf("%d\n", tno.dep); return 0;} //是否是目标 } } } } } printf("NO ANSWER!\n"); return 0; }
- 1
信息
- ID
- 779
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 80
- 已通过
- 13
- 上传者