uva 253 - Cube painting

六面匹配算法
本文介绍了一个用于判断六面体各个面是否匹配的算法。通过旋转操作实现不同状态下的匹配检查,共涉及24种可能的状态。若所有面的特征值一致,则视为匹配成功。

1,2,3,4,5,6六个面分别朝上  判断是否匹配    不匹配则顺时针旋转总共三次   每次都要判断是否匹配  

总共24种状态   每种状态判断一遍    满足就输出TRUE   否则输出FALSE

哎  代码写得好搓

#include<cstdio>
#include<cstring>

int rot_up(char *p)//返回1说明完全匹配了
{
    char q[4];
    q[0] = p[6];q[1] = p[7];q[2] = p[10];q[3] = p[11];
    p[6] = q[1];p[7] = q[3];p[10] = q[0];p[11] = q[2];
    for(int i = 0; i < 6;i++)
        if(p[i] != p[i+6])return 0;
    return 1;
}

int  rot_right(char *p)
{
    char q[4];
    q[0] = p[7];q[1] = p[8];q[2] = p[9];q[3] = p[10];
    p[7] = q[2];p[8] = q[0];p[9] = q[3];p[10] =q[1];
    for(int i = 0; i < 6;i++)
        if(p[i] != p[i+6])return 0;
    return 1;
}


int main()
{
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    #endif // LOCAL
    char str[15];
    while(gets(str)!=NULL)
    {
        int i,flag = 0;
        for(i = 0; i < 6;i++)
            if(str[i] != str[i+6])break;
        if(i == 6){printf("TRUE\n");continue;}
        char s[15];
        strcpy(s,str);
        for(i = 0; i < 3&&flag!=1; i++)
            if(rot_right(s))flag = 1;
        if(flag == 1){printf("TRUE\n");continue;}
        for(i = 0; i < 4&&flag!=1; i++)//3面朝上
        {
            if(i == 0)flag = rot_up(s);
            else flag = rot_right(s);
        }
        if(flag == 1){printf("TRUE\n");continue;}
        strcpy(s,str);
        for(i = 0; i < 4&&flag!=1; i++)//2面朝上
        {
            if(i == 0)flag = rot_up(s);
            else flag = rot_right(s);
        }
        if(flag == 1){printf("TRUE\n");continue;}
        strcpy(s,str);
        //4面朝上
        flag = rot_right(s);
        if(flag == 1){printf("TRUE\n");continue;}
        for(i = 0; i < 4&&flag!=1; i++)
        {
            if(i == 0)flag = rot_up(s);
            else flag = rot_right(s);
        }
        if(flag == 1){printf("TRUE\n");continue;}
        //5面朝上
        strcpy(s,str);
        if(rot_right(s)){printf("TRUE\n");continue;}
        if(rot_right(s)){printf("TRUE\n");continue;}
        for(i = 0; i < 4&&flag!=1; i++)
        {
            if(i == 0)flag = rot_up(s);
            else flag = rot_right(s);
        }
        if(flag == 1){printf("TRUE\n");continue;}
        //6面朝上
        strcpy(s,str);
        if(rot_up(s)){printf("TRUE\n");continue;}
        for(i = 0; i < 4&&flag!=1; i++)
        {
            if(i == 0)flag = rot_up(s);
            else flag = rot_right(s);
        }
        if(flag == 1){printf("TRUE\n");continue;}
        printf("FALSE\n");
    }
    return 0;
}


    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值