POJ 3087 Shuffle 'm Up (간단 한 시 뮬 레이 션)

설명 주어진 길 이 는 C 두 문자열 S1, S2, 그리고 요구 하 는 결과 문자열 SS 입 니 다.먼저 S2 의 맨 아래 카드 를 맨 아래 에 놓 은 다음 에 S1, S2 가 교차 하 는 겹 쳐 서 S 를 얻 은 다음 에 S 의 맨 아래 C 자 를 S1 에 할당 하고 나머지 대 가 를 S2 에 부여 하 며 위의 과정 을 다시 반복 한다.마지막 으로 SS 를 얻 으 려 면 몇 단계 의 과정 이 필요 합 니 다. Input 여러 조 의 사례 가 필요 합 니 다. 첫 번 째 행위 사례 는 test 입 니 다. 각 조 의 사례 는 첫 번 째 행위 S1, S2 길이 이 고 그 다음 에 세 줄 은 각각 S1, S2, SS Output 을 입력 하여 각 조 의 사례 에 대해 이 과정 걸음 수 를 출력 합 니 다.목적 에 도달 하지 못 하면 출력 - 1 Sample Input 2 4 AHAH HAHA HHAAAH 3 CDE EEDDCC Sample Output 1, 2, 2 - 1 Solution 을 간단하게 시 뮬 레이 션 합 니 다. 만약 에 몇 번 조작 한 후에 앞 에 이미 나타 난 상태 가 나타 나 면 순환 에 빠 져 목표 상태 에 도달 할 수 없습니다. 출력 - 1 Code
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
using namespace std;
int main()  
{  
    int test,c,i,k;  
    int t=0;  
    cin>>test;  
    while(++t<=test)  
    {  
        cin>>c;  
        char s1[201];  
        char s2[201];   
        char s12[401]; 
        cin>>s1>>s2>>s12;    
        map<string,bool>vist;//           
        vist[s12]=true;
        int step=0;//      
        while(true)  
        {  
            char s[201];    
            int ps=0;    
            for(i=0;i<c;i++)//   
            {  
                s[ps++]=s2[i];  
                s[ps++]=s1[i];  
            }  
            s[ps]='\0';//  '\0' 
            step++;//     
            if(!strcmp(s,s12))//       
            {  
                cout<<t<<' '<<step<<endl;  
                break;  
            }  
            else if(vist[s]&&strcmp(s,s12))//               
            {                                  
                cout<<t<<' '<<-1<<endl;  
                break;  
            }   
            vist[s]=true;//       
            for(i=0;i<c;i++)//        s1 
                s1[i]=s[i];  
            s1[i]='\0';  
            for(k=0;i<2*c;i++,k++)//        s2 
                s2[k]=s[i];  
            s2[i]='\0';  
        }  
    }  
    return 0;  
}  

좋은 웹페이지 즐겨찾기