tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

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);
	}
}