UVA253——骰子涂色(Cube painting)

别人都是1000bytes就搞定了。我却要3000bytes。不过一次性AC的感觉真的很不错!

用的方法是:将第二个骰子的每个面都转到第1个面,然后以第1个面为轴旋转4次来判断是否相等。这样就能枚举出所有的可能。


#include
#include

char a[8];
char b[8];
char temp[8];

int check(){
	for(int i=0;i<6;i++){
		if(a[i]!=temp[i]) return 0;
	}
	return 1;
}

void rotate1(){//以1面的法线为轴,逆时针旋转。即以右大拇指为轴,四指弯曲所指的方向旋转.
				//总共变换4个面
	char tt=temp[3];
	temp[3]=temp[1];
	temp[1]=temp[2];
	temp[2]=temp[4];
	temp[4]=tt;
}

void rotate2(){//以2面的法线为轴,逆时针旋转。
	char tt=temp[0];
	temp[0]=temp[3];
	temp[3]=temp[5];
	temp[5]=temp[2];
	temp[2]=tt;
}

void rotate3(){//以3面的法线为轴,逆时针旋转。
	char tt=temp[0];
	temp[0]=temp[1];
	temp[1]=temp[5];
	temp[5]=temp[4];
	temp[4]=tt;
}

int main(){
	char s[15];
	//freopen("input.txt","r",stdin);
	
	while(scanf("%s",s)!=EOF){
		int ar=0,ag=0,ab=0;
		int br=0,bg=0,bb=0;
		for(int i=0;i<6;i++){
			a[i]=s[i];
			b[i]=s[i+6];
		}
		strcpy(temp,b);

		for(int i=0;i<=6;i++){
			if(a[i]=='r') ar++;
			if(a[i]=='g') ag++;
			if(a[i]=='b') ab++;
			if(b[i]=='r') br++;
			if(b[i]=='g') bg++;
			if(b[i]=='b') bb++;
		}
		if(ar!=br || ag!=bg|| ab!=bb){
			printf("FALSE\n");
			continue;
		}
		
		//********以b第1个面为轴,变换4次,观察与a是否重合
		strcpy(temp,b);
		if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}

		//*********将b第2个面变换到第1面,作为轴,变换4次
		strcpy(temp,b);;rotate3();
		if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}

		//*********将b第3个面变换到第1面,作为轴,变换4次
		strcpy(temp,b);;rotate2();rotate2();rotate2();
		if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}

		//**********将b第4个面变换到第1个面,作为轴,变换4次
		strcpy(temp,b);;rotate2();
		if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}

		//**********将b第5面变换到第1个面,作为轴,变换4次
		strcpy(temp,b);;rotate3();rotate3();rotate3();
		if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}

		//**********将b第6面变换到第1个面,作为轴,变换4次
		strcpy(temp,b);;rotate3();rotate3();
		if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}
		rotate1();if(check()) {printf("TRUE\n");continue;}

		printf("FALSE\n");
	}
	return 0;
}


你可能感兴趣的:(解题报告)