SOJ 4590 简单模拟
Description
Gandtom把家搬到了一个交通便利的地方。今天来通知他的朋友Sidney,但是Sidney好像不在家,出门了,敲门没有人开门。
于是Gandtom把家里的地址写了下来。他担心别人看到了这张纸条,于是就把这个纸条塞到了一个魔方里,并且留下了一个式子。如果Sidney能照着式子将魔方复原,就能打开魔方,得到Gandtom的新住址。
众所周知,一个三阶魔方共有72种旋转方式,分述如图1。
给一个字符串,代表式子。该字符串仅包含 等二十二个字符。不存在的子串。最多只有一层括号。
我们将图2的魔方展开成图3的样子,并对图3位置进行编号,以便用字符串表示魔方。
用于表示魔方的字符串仅包含下列字母:-黄、-橙、-蓝、-红、-绿、-白,且一定是个可复原的魔方。该字符串表示位置的颜色为。例如,字符串即代表了图3。
试求魔方经过式子能否被复原。
Input
第一行有一个整数,表示组数。
每组数据第一行有一个字符串。
每组数据第二行有一个字符串。
Output
每组数据输出一行。
如果魔方能复原输出""(不含引号)。
否则输出""(不含引号)。
Sample Input
2
YYYYYYYYYGGGOOOBBBRRROOOBBBRRRGGGOOOBBBRRRGGGWWWWWWWWW
U
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; }