SOJ 4590 简单模拟

Description

  Gandtom把家搬到了一个交通便利的地方。今天来通知他的朋友Sidney,但是Sidney好像不在家,出门了,敲门没有人开门。 
  于是Gandtom把家里的地址写了下来。他担心别人看到了这张纸条,于是就把这个纸条塞到了一个魔方里,并且留下了一个式子。如果Sidney能照着式子将魔方复原,就能打开魔方,得到Gandtom的新住址。 
  众所周知,一个三阶魔方共有72种旋转方式,分述如图1。 
  图1.jpg-162.6kB 
  给一个字符串,代表式子。该字符串仅包含                     等二十二个字符。不存在的子串。最多只有一层括号。 
  我们将图2的魔方展开成图3的样子,并对图3位置进行编号,以便用字符串表示魔方。 
  图2.jpg-34.5kB 图3.jpg-54kB 
  用于表示魔方的字符串仅包含下列字母:-黄、-橙、-蓝、-红、-绿、-白,且一定是个可复原的魔方。该字符串表示位置的颜色为。例如,字符串即代表了图3。 
  试求魔方经过式子能否被复原。

 

Input

第一行有一个整数,表示组数。 
每组数据第一行有一个字符串 
每组数据第二行有一个字符串

 

Output

每组数据输出一行。 
如果魔方能复原输出""(不含引号)。 
否则输出""(不含引号)。

 

Sample Input


YYYYYYYYYGGGOOOBBBRRROOOBBBRRRGGGOOOBBBRRRGGGWWWWWWWWW 

YYYYYYYYYGGGOOOBBBRRROOOBBBRRRGGGOOOBBBRRRGGGWWWWWWWWW 
(U'U2U'2)2(U')

 

Sample Output

YES 
YES

 

思路:

没啥好说的,就是模拟,有部分操作可以由其余的操作演变而来,不需要重复写

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
char a[100],op[1000];
void sup(int aa,int b,int c,int d){
    char temp=a[aa];a[aa]=a[b];a[b]=a[c];a[c]=a[d];a[d]=temp;
}
void change(char c){
    char temp;
    if(c=='R'){
        temp=a[14];a[14]=a[47];a[47]=a[42];a[42]=a[2];a[2]=temp;
        temp=a[26];a[26]=a[50];a[50]=a[30];a[30]=a[5];a[5]=temp;
        temp=a[38];a[38]=a[53];a[53]=a[18];a[18]=a[8];a[8]=temp;
        sup(16,27,40,29);
        sup(17,15,39,41);
    }
    if(c=='L'){
        sup(12,0,44,45);
        sup(24,3,32,48);
        sup(36,6,20,51);
        
        sup(10,21,34,23);
        sup(11,9,33,35);
    }
    if(c=='U'){
        sup(9,12,15,18);
        sup(10,13,16,19);
        sup(11,14,17,20);
        
        sup(1,3,7,5);
        sup(0,6,8,2);
    }
    if(c=='D'){
        sup(36,33,42,39);
        sup(37,34,43,40);
        sup(38,35,44,41);
        
        sup(46,48,52,50);
        sup(45,51,53,47);
    }
    if(c=='F'){
        sup(15,6,35,47);
        sup(27,7,23,46);
        sup(39,8,11,45);
        
        sup(13,24,37,26);
        sup(12,36,38,14);
    }
    if(c=='B'){
        sup(0,17,53,33);
        sup(1,29,52,21);
        sup(2,41,51,9);
        
        sup(19,30,43,32);
        sup(18,42,44,20);
    }
    if(c=='M'){
        sup(13,1,43,46);
        sup(25,4,31,49);
        sup(37,7,19,52);
    }
    if(c=='E'){
        sup(24,21,30,27);
        sup(25,22,31,28);
        sup(26,23,32,29);
    }
    if(c=='S'){
        sup(5,10,48,40);
        sup(4,22,49,28);
        sup(3,34,50,16);
    }
    if(c=='r'){
        change('R');
        change('M');
        change('M');
        change('M');
    }
    if(c=='l'){
        change('L');
        change('M');
    }
    if(c=='u'){
        change('U');
        change('E');
        change('E');
        change('E');
    }
    if(c=='d'){
        change('D');
        change('E');
    }
    if(c=='f'){
        change('F');
        change('S');
    }
    if(c=='b'){
        change('B');
        change('S');
        change('S');
        change('S');
    }
    if(c=='x'){
        change('r');
        change('L');
        change('L');
        change('L');
    }
    if(c=='y'){
        change('u');
        change('D');
        change('D');
        change('D');
    }
    if(c=='z'){
        change('f');
        change('B');
        change('B');
        change('B');
    }
}
bool sp(int i,int j,int k)
{
    if(a[i]!=a[j]||a[k]!=a[j]||a[i]!=a[k])return 0;
    return 1;
}
bool equal(){
    for(int i=0;i<=17;i++)
     if(a[3*i]!=a[3*i+1]||a[3*i+2]!=a[3*i+1]||a[3*i]!=a[3*i+2])return 0;
    if(!sp(0,3,6))return 0;
    if(!sp(9,21,33))return 0;
    if(!sp(12,24,36))return 0;
    if(!sp(15,27,39))return 0;
    if(!sp(18,30,42))return 0;
    if(!sp(45,48,51))return 0;
    return 1;
}
int main()
{
    int T,i,jl,j,k,flg;
    scanf("%d",&T);
    while(T--)
    {
        jl=0;
        scanf("%s",a);
        scanf("%s",op);
        for(i=0;i<strlen(op);i++)
        {
            if(op[i]=='(')flg=i;
            else if(op[i]==39){
                change(op[i-1]);
                change(op[i-1]);
            }
            else if(op[i]=='2'){
                if(op[i-1]==39){
                 change(op[i-2]);
                 change(op[i-2]);
                 change(op[i-2]);
                }
                else if(op[i-1]==')'){
                    op[i]='q';
                    i=flg;
                }
                else change(op[i-1]);     
            }
            else change(op[i]);
        }
       if(equal())printf("YES\n");
       else printf("NO\n");
    }
    return 0;
}

 

posted @ 2018-04-25 18:51  87hbteo  阅读(255)  评论(0编辑  收藏  举报