赤裸裸的模拟题。。
给出字符串 s1,s2,s12;判断s1,s2能够通过题目中所给的规则到达 s12。每次只会产生一种新的状态,还BFS个毛线--
s1的首位新生成的字符串的首,s2的尾为新生成字符串的尾。中间的字符依次交叉排列。
再将新生成的字符串的前一半给s1,后一半给s2。
重复上述两步 直到到达 s12 或者 新生成的字符串已经出现过。
前者输出步数,后者输出 -1。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 7 using namespace std; 8 9 struct N 10 { 11 char s[210]; 12 N *l,*r; 13 }; 14 15 N *creat() 16 { 17 N *p = (N *)malloc(sizeof(N)); 18 p->l = p->r = NULL; 19 return p; 20 } 21 22 bool check(char *s,N *&root) 23 { 24 if(root == NULL) 25 { 26 27 root = creat(); 28 strcpy(root->s,s); 29 30 return true; 31 } 32 int order = strcmp(s,root->s); 33 34 if(order == 0) 35 return false; 36 37 if(order < 0) 38 return check(s,root->l); 39 40 return check(s,root->r); 41 } 42 43 int main() 44 { 45 int T,icase = 0,ans; 46 47 scanf("%d",&T); 48 49 while(T--) 50 { 51 int len,i; 52 53 char s1[110],s2[110],s12[210],t[210]; 54 55 N *root = NULL; 56 ans = 0; 57 58 scanf("%d%*c",&len); 59 60 scanf("%s%s%s",s1,s2,s12); 61 62 strcpy(t,s12); 63 64 while(check(t,root)) 65 { 66 ++ans; 67 for(i = 0;i < len; ++i) 68 { 69 t[2*i] = s2[i]; 70 t[2*i+1] = s1[i]; 71 } 72 t[2*len] = '