POJ 3087 Shuffle'm Up

来源:互联网 发布:js除以10000四舍五入 编辑:程序博客网 时间:2024/06/01 07:58

  赤裸裸的模拟题。。

  给出字符串 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 N10 {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] = '\0';73             for(i = 0;i < len; ++i)74             {75                 s2[i] = t[i+len];76                 s1[i] = t[i];77             }78             s1[len] = s2[len] = '\0';79         }80         if(strcmp(t,s12) == 0)81             printf("%d %d\n",++icase,ans);82         else83             printf("%d -1\n",++icase);84     }85     return 0;86 }
View Code