紫书题解4.正方体涂色 (UVa 253 模拟)

题目链接:https://vjudge.net/problem/UVA-253

大意:给定两个六面涂有红,蓝,绿的正方体,问是否能够通过旋转,将一个正方体转化为另一个正方体

弱鸡翻译,当英语练习,仅供参考

    我们有一个用来给正方体上色的机器。它提供三种不同的颜色:蓝,红和绿。每一面都会涂上其中一种颜色。
正方体的每一面的编号如图Figure 1所示

    由于正方体有6面,在给每一面编号时,我们的机器有3^6=729种不同的上色方法。当忽略每一面的编号时,
不同上色方法的数量更加少。因为正方体可以旋转。见下面的例子。

    我们用含有6个字符的字符串来表示上好色的正方体,每个字符为'b','r'或'g'(b表示blue,r表示red,g
表示green)。第i个字符(1<=i<=6)代表第i面的颜色。例如,图Figure 2 的图片表示"rbgggr",图Figure 3相
当于"rggbgr"。请注意这两个正方体上色方式是一样的:通过垂直旋转90度,一个正方体可以转变成另一个正方体。


输入

   输入你程序的是一个带有标准文件结尾标记的text文件。每一行是一个含12个字符的字符串。这个字符串的
前6个字符代表一个涂好色的正方体,后面6个字符又代表另一个涂好色的正方体。你的程序探查这两个正方体
是否用相同的方法涂色,这就是,通过任意混合旋转(横竖旋转都行)是否能将一个正方体转变成另一个正方体
(镜像不被许可)



 

本菜表示一脸蒙逼(空间几何想象力不行)

后来无意间阅读了一位大佬的文章:https://blog.csdn.net/Ramay7/article/details/50357366才明白怎么回事。

具体思路是将两面固定,然后旋转,看看是否能够与另一个正方体颜色一样。

 

在阅读和理解大佬的代码后,在大佬的代码上加上自己的注释,做出一些微小的修改后,我不要脸地AC了(我不生成代码,我只是代码的搬运工,哭)

当然自己也能从头再写,不过估计写出来也差不多,顶多是变量名称有所不同

 

代码搬运(除了注释几乎都是别人写的)

#include<stdio.h>
#include<iostream>
#include <string.h>
using namespace std;
const int N=20;//N=20没别的意思,可以更小的,可以为6

char str[N],str1[N],str2[N];//字符串,立方体1,立方体2
int dir[6][6]={ {0,1,2,3,4,5},{1,5,2,3,0,4},{2,1,5,0,4,3},{3,1,0,5,4,2},
                {4,0,2,3,5,1},{5,4,2,3,1,0} };//0代表面1。。。5代表面6
//dir[6][6]数组的作用就是固定两个面(固定temp[0],temp[5])。
//比如{0,1,2,3,4,5}固定了面1和面6
//{1,5,2,3,0,4}固定了面2和面5
//要注意的是必须保证temp[1]与temp[4]对面,temp[2]与temp[3]对面

//数据处理
bool fun(){
    char temp[N]={0};
    for(int i=0;i<6;i++)//要固定6次。因为题目要求不能镜像。
    {
        for(int j=0;j<6;j++)
        {
            temp[j]=str1[dir[i][j]];
        }
        for(int j2=0;j2<4;j2++)//固定两面(temp[0],temp[5])后,进行旋转;旋转得到的样式有4个
        {
			//交换数据,达到旋转的目的
			//注意:面1与面6,面2与面5,面3与面4是对面的,所以不能交换!
			//又∵面1=temp[0],面2=temp[1]...面6=temp[5],
			//∴temp[1]不能与temp[4]交换,temp[2]不能与temp[3]交换

            char cha;//在交换的时候临时储存数据

			//temp[0],temp[3]不参与翻转
			//其中的一种交换方法,亲测只要temp[1]不与temp[4]交换,temp[2]不与temp[3]交换就能AC成功
			//下面就是我自己改动的一种交换方法
            cha=temp[1];
            temp[1]=temp[3];
            temp[3]=temp[4];
            temp[4]=temp[2];
            temp[2]=cha;
            if(strcmp(temp,str2)==0) return true;//获得的字符串与str2比较,如果和第二个正方体一样,返回为真
        }
    }
    return false;
}

//数据接收和输出
int main()
{
    while(scanf("%s",str)!=EOF)
    {
        for(int i=0;i<6;i++) str1[i]=str[i];//立方体1
        for(int i2=0;i2<6;i2++) str2[i2]=str[i2+6];//立方体2
        if(fun()) puts("TRUE");
        else puts("FALSE");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值