别人都是1000bytes就搞定了。我却要3000bytes。不过一次性AC的感觉真的很不错!
用的方法是:将第二个骰子的每个面都转到第1个面,然后以第1个面为轴旋转4次来判断是否相等。这样就能枚举出所有的可能。
#include<stdio.h>
#include<string.h>
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;
}
本文介绍了一种通过旋转和比较两个骰子的状态来判断它们是否相同的方法。该算法使用C语言实现,通过枚举所有可能的旋转方式来完成判断。
&spm=1001.2101.3001.5002&articleId=51585448&d=1&t=3&u=7ca074386b984731a40c722c75223688)
2180

被折叠的 条评论
为什么被折叠?



