uvalive 3401 poj 2741 Colored Cubes

/// uvalive 3401 poj 2741 Colored Cubes
// AC
// A.myc
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
string color[5][7];
int rota[24][6]= { { 0, 1, 2, 3, 4, 5 }, { 0, 2, 4, 1, 3, 5 }, { 0, 4, 3, 2, 1, 5 }, { 0, 3, 1, 4, 2, 5 }, { 3, 1, 0, 5,
        4, 2 }, { 3, 0, 4, 1, 5, 2 }, { 3, 4, 5, 0, 1, 2 }, { 3, 5, 1, 4, 0, 2 }, { 5, 1, 3, 2, 4, 0 }, { 5, 3, 4, 1,
        2, 0 }, { 5, 4, 2, 3, 1, 0 }, { 5, 2, 1, 4, 3, 0 }, { 2, 1, 5, 0, 4, 3 }, { 2, 5, 4, 1, 0, 3 }, { 2, 4, 0, 5,
        1, 3 }, { 2, 0, 1, 4, 5, 3 }, { 4, 0, 2, 3, 5, 1 }, { 4, 2, 5, 0, 3, 1 }, { 4, 5, 3, 2, 0, 1 }, { 4, 3, 0, 5,
        2, 1 }, { 1, 0, 3, 2, 5, 4 }, { 1, 3, 5, 0, 2, 4 }, { 1, 5, 2, 3, 0, 4 }, { 1, 2, 0, 5, 3, 4 } };  // ## copied
int Change(string a,string b){
	if(a==b) return 0;
	return 1;
}
int Change(string a,string b,string c){
	if(a==b && b==c) return 0;
	if(a==b) return 1;
	if(a==c) return 1;
	if(b==c) return 1;
	return 2;
}
int Change(string a,string b,string c,string d){
	if(a==b && b==c && c==d) return 0;
	if(a!=b && a!=c && a!=d && b!=c && b!=d && c!=d) return 3;
	if(a==b && b==c) return 1;
	if(a==b && b==d) return 1;
	if(a==c && c==d) return 1;
	if(b==c && c==d) return 1;
	return 2;
}
int Check(int b){
	int change=0;
	for(int i=0;i<6;i++){
		//change+=Change(color[0][i],color[1][rota[b][i]-1]); // ##
		change+=Change(color[0][i],color[1][rota[b][i]]); // ##
	}
	return change;
}
int Check(int b,int c){
	int change=0;
	for(int i=0;i<6;i++){
		//change+=Change(color[0][i],color[1][rota[b][i]-1],color[2][rota[c][i]-1]); // ##
		change+=Change(color[0][i],color[1][rota[b][i]],color[2][rota[c][i]]); // ##
	}
	return change;
}
int Check(int b,int c,int d){
	int change=0;
	for(int i=0;i<6;i++){
		//change+=Change(color[0][i],color[1][rota[b][i]-1],color[2][rota[c][i]-1],color[3][rota[d][i]-1]); // ##
		change+=Change(color[0][i],color[1][rota[b][i]],color[2][rota[c][i]],color[3][rota[d][i]]); // ##
	}
	return change;
}
int Match2(){
	int change=100;
	for(int i=0;i<24;i++){
		int change_=Check(i);
		if(change_<change) change=change_;
	}
	return change;
}
int Match3(){
	int change=100;
	for(int i=0;i<24;i++)
		for(int j=0;j<24;j++){
			int change_=Check(i,j);
			if(change_<change) change=change_;
		}
	return change;
}
int Match4(){
	int change=100;
	for(int i=0;i<24;i++)
		for(int j=0;j<24;j++)
			for(int k=0;k<24;k++){
				int change_=Check(i,j,k);
				if(change_<change) change=change_;
			}
	return change;
}
int main(){
	int n;
	while(scanf("%d",&n) && n!=0){
		for(int i=0;i<n;i++)
			for(int j=0;j<6;j++)
				cin>>color[i][j]; // ##
		switch(n){
			case 1: printf("0\n"); break;
			case 2: printf("%d\n",Match2()); break;
			case 3: printf("%d\n",Match3()); break;
			case 4: printf("%d\n",Match4()); break;
			default: break;
		}
	}
	return 0;
}

你可能感兴趣的:(动态规划,ACM,uvalive,uva,单调队列)