AOJ 1259: Colored Cubes
やるだけだけどどうやるか考えた
なんかこのやり方はだいぶ失敗な気がするんだけどループの段数が入力によって可変だと変なソースになるのはどうしようもないと思う。
#include<stdio.h> #include<string> #include<algorithm> #include<vector> using namespace std; int dice[6][6]={ {0,1,2,4,3,5}, {2,0,1,5,4,3}, {1,2,0,3,5,4}, {4,5,3,0,2,1}, {5,3,4,2,1,0}, {3,4,5,1,0,2}, }; int q[4]; string str[4][6]; char in[30]; int main(){ int a; while(scanf("%d",&a),a){ for(int i=0;i<a;i++)for(int j=0;j<6;j++){ scanf("%s",in); str[i][j]=in; } //swap(str[0][3],str[0][4]); if(a==1){ printf("0\n");continue; } int ret=99999999; for(int i=0;i<24;i++){ q[1]=i; if(a>2){ for(int j=0;j<24;j++){ q[2]=j; if(a>3){ for(int k=0;k<24;k++){ q[3]=k; vector<string>v[6]; int val=0; for(int t=0;t<a;t++) for(int x=0;x<6;x++){ if(x==0||x==5)v[x].push_back(str[t][dice[q[t]/4][x]]); else v[x].push_back(str[t][dice[q[t]/4][1+(q[t]+x)%4]]); } for(int t=0;t<6;t++){ int tmp=0; for(int x=0;x<v[t].size();x++){ int t2=0; for(int y=0;y<v[t].size();y++)if(v[t][x]==v[t][y])t2++; tmp=max(tmp,t2); } val+=v[t].size()-tmp; } ret=min(ret,val); } }else{ vector<string>v[6]; int val=0; for(int t=0;t<a;t++) for(int x=0;x<6;x++){ if(x==0||x==5)v[x].push_back(str[t][dice[q[t]/4][x]]); else v[x].push_back(str[t][dice[q[t]/4][1+(q[t]+x)%4]]); } for(int t=0;t<6;t++){ int tmp=0; for(int x=0;x<v[t].size();x++){ int t2=0; for(int y=0;y<v[t].size();y++)if(v[t][x]==v[t][y])t2++; tmp=max(tmp,t2); } val+=v[t].size()-tmp; }ret=min(ret,val); } } }else{ vector<string>v[6]; for(int t=0;t<a;t++) for(int x=0;x<6;x++){ if(x==0||x==5)v[x].push_back(str[t][dice[q[t]/4][x]]); else v[x].push_back(str[t][dice[q[t]/4][1+(q[t]+x)%4]]); } int val=0; for(int t=0;t<6;t++){ int tmp=0; for(int x=0;x<v[t].size();x++){ int t2=0; for(int y=0;y<v[t].size();y++)if(v[t][x]==v[t][y])t2++; tmp=max(tmp,t2); } val+=v[t].size()-tmp; } ret=min(ret,val); } } printf("%d\n",ret); } }