jiufeng and CFOP
九峰与CFOP
https://ac.nowcoder.com/acm/contest/9984/C
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; }