您的位置:首页 > 其它

搜索专题 J

2017-05-30 21:12 113 查看
1  简单描述

有两堆纸牌,每堆纸牌有颜色不同的纸牌,按照一定规则混合洗牌。经过一系列洗牌,是否能组合成题中所给的排序。要是能,最少多少次洗牌。

2    思路

#include
<iostream>
#include 
<string.h>
#include 
<algorithm>
#include
<map>
using namespace std;

int main()
{

    char s1[105], s2[105], s12[210],
s[210];

    int t, c, cou, x
= 0, i, j, k;

    cin>>t;

    while(t--)

    {

        x++;

        cou = 0;

        cin>>c;

        cin>>s1;

        cin>>s2;

        cin>>s12;

        memset(s,
'1',
sizeof(s));

        map < string,
int>vis;                
//用map记录字符串出现与否。

        vis[s12]
= 1;

        vis[s]
= 0;

        while(strcmp(s, s12)
!= 0
&& vis[s]
== 0)     
//出口两个:1.与目标相同了 2.又到了出现过的字符串,即进入”环“状态,此时必定不能洗到目标状态

        {

            vis[s]
= 1;

            for(i
= j = k =
0 ; i <
2*c ; i++)

            {

                if(i%2
== 0)

                {

                    s[i]
= s2[j];

                    j++;

                }

                else

                {

                    s[i]
= s1[k];

                    k++;

                }

            }

            s[i]
= '\0';

            cou++;

            for(i
= 0 ; i
< c ; i++)

                s1[i]
= s[i];

            for(j
= c,k =
0 ; j <
2*c ; j++, k++)

                s2[k]
= s[j];

        }

        if(strcmp(s, s12)
== 0)

           cout<<x<<' '<<cou<<endl;

        else

            cout<<x<<' '<<"-1"<<endl;

    }

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: