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

这道题还是需要好好总结一下的

猜你喜欢

转载自www.cnblogs.com/TorettoRui/p/10408394.html