uva 253 - Cube painting

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;

int main(void)
{
    char a[13], c1[6], c2[6]; 
#ifndef ONLINE_JUDGE
    freopen("in", "r", stdin);
#endif
    while (cin>>a)
    {
        int i, j = 0;
        for (i = 0; i < 6; i++)    { c1[i] = a[i]; c2[i] = a[i+6]; }
        int mrk;
        for (i = 0; i < 3; i++)
        { 
            mrk = 0;
            for (j = 0; j < 6; j++)
            {
                if (c1[i]==c2[j] && c1[5-i]==c2[5-j])
                {
                    mrk = 1; c2[j] = '0'; c2[5-j] = '0'; break;    
                }
            }
            if (!mrk)    break;
        }
        if (!mrk)    cout << "FALSE" << endl;
        else    cout << "TRUE" << endl;
    }

    return 0;
}

这道题目开始没想通,去看别人的代码,网上有很多人用的暴力,只看到一个很犀利的想法,如下:

设两个正方体是 c1, c2, 保持 c1 不变,枚举 c1 的相邻的三个面,和 c2 的6个面依次对比,如果这个面和其中一个面相同,并且这两个面的对面也对应相同,那么就把 c2 的这两个面标记为字符 ‘0’ ,防止以后再次用到这两个面。如果对于 c1 的这三个面的其中一个面,在 c2 中找不到符合条件(即两个面相同并且对面也相同)的,就退出循环,说明这两个正方体不相同,否则,这两个正方体相同。

唉,不愧是大牛的想法,ORZ…………

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值