POJ

来源:互联网 发布:精通matlab混合编程 编辑:程序博客网 时间:2024/05/29 07:55

题意: 有两堆牌s1和s2 输入顺序都是从下到上的。 每次进行这样的操作:取s2的第一张放在新堆里的顶端,取s1的第一张放在新堆里的顶端,重复操作直到s1和s2为空,这时判断新堆s是否和目的堆相等,如果相等就输出经历的次数,否则将生成堆的下面的c个给s1,其余的给s2,重复操作。注意的是用map查重,一旦出现重复说明为死循环,输出-1.


我也不知道这能不能算是搜索。

#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <map>using namespace std;map<string,int> ma;string s1,s2;//vector<char> v;string s3;string s;string s4;int c,t;void simulate_it(){    int ans= 0;    while(true)    {//        v.clear();        int e=0;        s="";//        cout << "len : " <<s1.size() << ' ' <<s2.size() <<endl;        for(int i=0;i<s1.size()||i<s2.size();i++)        {            if(i>=s1.size())            {                s+=s2[i];//                cout << s[e-1] << " " ;            }            else if(i>=s2.size())            {                 s+=s1[i];//              C  cout << s[e-1] << " "  ;            }            else            {                 s+=s2[i];                 s+=s1[i];//                 cout << s[e-2]  << " " ;//                 cout << s[e-1]  << " " ;            }        }//        s4=s;//        for(int i=0;i<v.size();i++)//        {//            s[i]=v[i];//        }//        for(int i=0;i<e;i++)//        {//            cout << s4[i] << ' ' ;//        }//        cout << endl;        ans++;//        cout <<"s:" << s<<endl;        if(s==s3)        {            cout << ans << endl;            break;        }        if(ma[s]!=0)        {            cout << "-1" << endl;            break;        }        ma[s]++;        s1="";        s2="";        for(int i=0;i<s.size();i++)        {          if(i<c)  s1+=s[i];          else     s2+=s[i];        }    }//    return 0;}int main(){    cin  >> t;    for(int i=1;i<=t;i++)    {        ma.clear();        scanf("%d",&c);        cin >> s1 >> s2 >> s3;        cout << i << " ";        simulate_it();    }    return 0;}


1 0
原创粉丝点击