C-jiufeng and CFOP

做题时,一般都要揣摩出题人的意图,
像是这道题,
一看就知道,
出题人想让我死

#include<bits/stdc++.h>
using namespace std;
int n,m,a[6][9],b[6][9],d[6][9],g[9];
int c=-1,f=-1,o=-1,p=-1;
int to[9]={6,3,0,7,4,1,8,5,2};
void rotate(int a[][9],int fa,int t){
    if(t>1)rotate(a,fa,t-1);
    memcpy(g,a[fa],sizeof g);
    for(int i=0;i<9;i++)a[fa][i]=g[to[i]];
}
void U(int a[][9],int t){
    if(t>1)U(a,t-1);
    memcpy(d,a,sizeof d);
    for(int j=0;j<3;j++){
        a[1][j]=d[2][j];
        a[2][j]=d[4][j];
        a[4][j]=d[3][j];
        a[3][j]=d[1][j];
    }
    rotate(a,5,1);
}
void R(int a[][9],int t){
    if(t>1)R(a,t-1);
    memcpy(d,a,sizeof d);
    for(int j=0;j<3;j++)a[5][2+3*j]=d[1][2+3*j];
    for(int j=0;j<3;j++)a[1][2+3*j]=d[0][6-3*j];
    for(int j=0;j<3;j++)a[0][6-3*j]=d[4][6-3*j];
    for(int j=0;j<3;j++)a[4][6-3*j]=d[5][2+3*j];
    rotate(a,2,1);
}
void F(int a[][9],int t){
    if(t>1)F(a,t-1);
    memcpy(d,a,sizeof d);
    for(int j=0;j<3;j++)a[2][3*j]=d[5][6+j];
    for(int j=0;j<3;j++)a[5][6+j]=d[3][8-3*j];
    for(int j=0;j<3;j++)a[3][8-3*j]=d[0][6+j];
    for(int j=0;j<3;j++)a[0][6+j]=d[2][3*j];
    rotate(a,1,1);
}
void D(int a[][9],int t){
    if(t>1)D(a,t-1);
    memcpy(d,a,sizeof d);
    for(int j=6;j<9;j++){
        a[2][j]=d[1][j];
        a[1][j]=d[3][j];
        a[3][j]=d[4][j];
        a[4][j]=d[2][j];
    }
    rotate(a,0,1);
}
void L(int a[][9],int t){
    if(t>1)L(a,t-1);
    memcpy(d,a,sizeof d);
    for(int j=0;j<3;j++)a[1][3*j]=d[5][3*j];
    for(int j=0;j<3;j++)a[5][3*j]=d[4][8-3*j];
    for(int j=0;j<3;j++)a[4][2+3*j]=d[0][2+3*j];
    for(int j=0;j<3;j++)a[0][2+3*j]=d[1][6-3*j];
    rotate(a,3,1);
}
void B(int a[][9],int t){
    if(t>1)B(a,t-1);
    memcpy(d,a,sizeof d);
    for(int j=0;j<3;j++)a[5][j]=d[2][2+3*j];
    for(int j=0;j<3;j++)a[2][2+3*j]=d[0][j];
    for(int j=0;j<3;j++)a[0][j]=d[3][6-3*j];
    for(int j=0;j<3;j++)a[3][6-3*j]=d[5][j];
    rotate(a,4,1);
}
void E(int a[][9],int t){
    if(t>1)E(a,t-1);
    memcpy(d,a,sizeof d);
    for(int j=3;j<6;j++){
        a[2][j]=d[1][j];
        a[1][j]=d[3][j];
        a[3][j]=d[4][j];
        a[4][j]=d[2][j];
    }
}
void M(int a[][9],int t){
    if(t>1)M(a,t-1);
    memcpy(d,a,sizeof d);
    for(int j=0;j<3;j++)a[1][1+3*j]=d[5][1+3*j];
    for(int j=0;j<3;j++)a[5][1+3*j]=d[4][7-3*j];
    for(int j=0;j<3;j++)a[4][7-3*j]=d[0][7-3*j];
    for(int j=0;j<3;j++)a[0][7-3*j]=d[1][1+3*j];
}
void S(int a[][9],int t){
    if(t>1)S(a,t-1);
    memcpy(d,a,sizeof d);
    for(int j=0;j<3;j++)a[2][1+3*j]=d[5][3+j];
    for(int j=0;j<3;j++)a[5][3+j]=d[3][7-3*j];
    for(int j=0;j<3;j++)a[3][7-3*j]=d[0][3+j];
    for(int j=0;j<3;j++)a[0][3+j]=d[2][1+3*j];
}
void run(int a[][9],string s,int t=1){
    if(s.size()==2)t=s[1]=='2'?2:3;
    if(s[0]=='U')U(a,t);
    if(s[0]=='R')R(a,t);
    if(s[0]=='F')F(a,t);
    if(s[0]=='D')D(a,t);
    if(s[0]=='L')L(a,t);
    if(s[0]=='B')B(a,t);
    if(s[0]=='E')E(a,t);
    if(s[0]=='M')M(a,t);
    if(s[0]=='S')S(a,t);
    if(s[0]=='u')U(a,t),E(a,4-t);
    if(s[0]=='r')R(a,t),M(a,4-t);
    if(s[0]=='f')F(a,t),S(a,t);
    if(s[0]=='d')D(a,t),E(a,t);
    if(s[0]=='l')L(a,t),M(a,t);
    if(s[0]=='b')B(a,t),S(a,4-t);
    if(s[0]=='x')R(a,t),M(a,4-t),L(a,4-t);
    if(s[0]=='y')U(a,t),E(a,4-t),D(a,4-t);
    if(s[0]=='z')F(a,t),S(a,t),B(a,4-t);
}
int findWhite(){for(int i=0;i<6;i++)if(a[i][4]==0)return i;return 0;}
void white2B(int a[][9],int w){
    for(int i=0;i<3&&a[0][4]!=0;i++)run(a,"x");
    for(int i=0;i<3&&a[0][4]!=0;i++)run(a,"z");
    for(int i=0;i<3&&a[1][4]!=1;i++)run(a,"y");
}
bool checkCross(int w){
    memcpy(b,a,sizeof b);
    white2B(b,w);
    for(int j=1;j<9;j+=2)if(b[0][j])return 0;
    for(int i=1;i<=4;i++)if(b[i][4]!=b[i][7])return 0;
    return 1;
}
bool checkF2L(int w){
    memcpy(b,a,sizeof b);
    white2B(b,w);
    for(int j=0;j<9;j++)if(b[0][j])return 0;
    for(int i=1;i<=4;i++)for(int j=3;j<9;j++)if(b[i][j]!=i)return 0;
    return 1;
}
void checkAll(int t){
    int w=findWhite(),flag=1;
    if(c==-1&&checkCross(w))c=t;
    if(f==-1&&checkF2L(w))f=t;
    if(o==-1){for(int j=0;j<9;j++)if(a[5-w][j]!=a[5-w][0])flag=0;if(flag&&checkF2L(w))o=t;}
    if(p==-1)for(int i=0;i<6;i++)for(int j=0;j<9;j++)if(a[i][j]!=a[i][0])return;p=t;
}
int main(){
    ios::sync_with_stdio(false);
    string op;
    cin>>n>>m;
    for(int i=0;i<6;i++)for(int j=0;j<9;j++)a[i][j]=i;
    for(int i=1;i<=n;i++)cin>>op,run(a,op);checkAll(0);
    for(int i=1;i<=m;i++){cin>>op;run(a,op);checkAll(i);}
    cout<<c<<" "<<f<<" "<<o<<" "<<p;
}