UVA253
作者:互联网
这道题其实很简单,只要能够搞清楚最基本的操作是什么就可以了
这道题中最基本的操作就是绕着某个轴顺时针旋转。
整体思路就是:(0代表z轴,1代表x轴,2代表y轴)
首先绕着0轴转四次,每转1次,都和fir立方体比较一次
然后再将0轴的上下面平面交换:即绕着1或者2轴转两次
然后再将x轴放到z轴上
然后再将y轴放到z轴上,如此遍历即可
下面贴上代码
//这道题只需要暴力将所有的都转一遍就可以了 //在转之前,可以先判断一下对应面是否是一致的 //某个面在上面固定不动的时候,一共有四种不同的情况,那么一共有24种情况 #include<cstdio> #include<cstring> using namespace std; char fir[3][2],sec[3][2];//0是z轴,1是x轴,2是y轴 int flag=1; void print_sec() { printf("sec\n"); for(int i=0;i<3;i++) { for(int j=0;j<2;j++) { printf("%3c",sec[i][j]); } printf("\n"); } printf("\n"); } void print_fir() { printf("fir\n"); for(int i=0;i<3;i++) { for(int j=0;j<2;j++) { printf("%3c",fir[i][j]); } printf("\n"); } printf("\n"); } bool initial() { char s[20]; if(scanf("%s",s)==1) { for(int i=0;i<3;i++) { fir[i][0]=s[i]; fir[i][1]=s[5-i]; } for(int i=0;i<3;i++) { sec[i][0]=s[i+6]; sec[i][1]=s[11-i]; } return true; } return false; } void rot(int p)//绕着p轴顺时针旋转 { char tem1=sec[(p+2)%3][0],tem2=sec[(p+2)%3][1]; sec[(p+2)%3][0]=sec[(p+1)%3][0]; sec[(p+2)%3][1]=sec[(p+1)%3][1]; sec[(p+1)%3][0]=tem2; sec[(p+1)%3][1]=tem1; } bool compare() { for(int i=1;i<=24;i++) { int same=1; rot(0);//每转4次以后就,就需要改变一下竖直的位置 //print_sec(); for(int j=0;j<6;j++) { //printf("%c %c\n",*(&fir[0][0]+j),*(&sec[0][0]+j)); if(!(*(&fir[0][0]+j)==*(&sec[0][0]+j))) { same=0; break; } } //printf("same=%d\n",same); if(same) return true; if(i%4==0)//已经转够4次了,该上下变换了 { rot(1); rot(1); } if(i%8==0)//这个时候该换垂直面了 { if(flag)//和第二行交换 { rot(1); flag=!flag; } else { rot(2); flag=!flag; } } } return false; } int main() { #ifdef local freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif while(initial()) { //print_fir(); //print_sec(); if(compare()) { printf("TRUE\n"); } else { printf("FALSE\n"); } } return 0; }
这里面有两个个细节很有趣:
第一个就是,从初始状态开始,先转动再去比较,最后第四次比较是,恰好是初始状态。并且将x轴放到了z轴上,并且遍历完8次的时候,原来的y轴还是在y轴上
第二个就是比较的那个地方,那个地方不需要都比较完,只需要有一个不相同,就可以break出来,而且二维数组的遍历也变得简单了起来,直接取A[0][0]的地址,然后再加需要访问第几个元素的j,即*(A[0][0]+j);
这道题还是需要好好总结一下的
标签:遍历,轴转,这道题,sec,UVA253,轴上,include 来源: https://www.cnblogs.com/TorettoRui/p/10408394.html