uva 253 - Cube painting(相同骰子)

习题4-4 骰子涂色(Cube painting, UVa 253)

输入两个骰子,判断二者是否等价。每个骰子用6个字母表示,如图4-7所示。

图4-7 骰子涂色

例如rbgggr和rggbgr分别表示如图4-8所示的两个骰子。二者是等价的,因为图4-8(a)

所示的骰子沿着竖直轴旋转90°之后就可以得到图4-8(b)所示的骰子。

(a) (b)

图4-8 旋转前后的两个骰子

.

Sample Input

rbgggrrggbgr

rrrbbbrrbbbr

rbgrbgrrrrrg

Sample Output

TRUE

FALSE

FALSE

思路:暴力枚举,将一个骰子的所有姿态都列出来,

1、注意第一个图上的数字,那个是记录骰子面的顺序

2、先找最上面的,也就是1的位置,能排列6种(1,2,3,4,5,6)

3、然后找到了上面也就找到了与其相对的面,就是下面,就是字串中第六个元素。这个不会额外记录,因为有上就有下了。

4、然后就是中间四个的排列了,很显然,4种。

5、然后我们变换第二个骰子,看看它在这24种情况中,有没有一种的情况和第一个骰子的记录是相同的。(比较字串即可)

6、请注意骰子面的转换是否正确,虽然这个逻辑简单,但是容易写错,要好好检查,我就因为写错下标错了两次。

#include<iostream>
#include<string>
using namespace std;
/*
  1
3 2 4 5         1在顶上
  6

  2
3 6 4 1         2在顶上
  5

  3
5 6 2 1         3在顶上
  4

  4
2 6 5 1         4在顶上
  3

  5
4 6 3 1         5在顶上
  2

  6
3 5 4 2         6在顶上
  1

*/
string s1,s2;//记录两个骰子的字符串
int str_equal(string a,char s1,char s2,char s3,char s4,char s5,char s6)//比较两个字串相等吗
{
    string b="0000000";
    b[1]=s1;
    b[2]=s2;
    b[3]=s3;
    b[4]=s4;
    b[5]=s5;
    b[6]=s6;
    //cout<<b.substr(1)<<endl;
    if(a==b)
        return 1;
    return 0;
}
int exc(string a,char s1,char s2,char s3,char s4,char s5,char s6)//中间四个面的四种情况
{
    if(str_equal(a,s1,s2,s3,s4,s5,s6)) return 1;
    if(str_equal(a,s1,s3,s5,s2,s4,s6)) return 1;
    if(str_equal(a,s1,s5,s4,s3,s2,s6)) return 1;
    if(str_equal(a,s1,s4,s2,s5,s3,s6)) return 1;
    return 0;
}
int main()
{
    char c;
    while(cin>>c)
    {
//        cin>>s1;
//        s2=s1.substr(5);
//        s1.assign(s1,0,6);
//        cout<<s1<<" "<<s2<<endl;
        //以上注释是一种输入方法,以下是另一种

        s1=s2="0000000";
        s1[1]=c;
        for(int i=2;i<=6;i++)  //因为s1[1]已经在while中输入了
            cin>>s1[i];
        for(int i=1;i<=6;i++)
            cin>>s2[i];
        //cout<<s1.substr(1)<<"  "<<s2<<endl;

        if(exc(s1,s2[1],s2[2],s2[3],s2[4],s2[5],s2[6])){cout<<"TRUE"<<endl;continue;}
        if(exc(s1,s2[2],s2[6],s2[3],s2[4],s2[1],s2[5])){cout<<"TRUE"<<endl;continue;}
        if(exc(s1,s2[3],s2[6],s2[5],s2[2],s2[1],s2[4])){cout<<"TRUE"<<endl;continue;}
        if(exc(s1,s2[4],s2[6],s2[2],s2[5],s2[1],s2[3])){cout<<"TRUE"<<endl;continue;}
        if(exc(s1,s2[5],s2[6],s2[4],s2[3],s2[1],s2[2])){cout<<"TRUE"<<endl;continue;}
        if(exc(s1,s2[6],s2[5],s2[3],s2[4],s2[2],s2[1])){cout<<"TRUE"<<endl;continue;}

        cout<<"FALSE"<<endl;

    }
    return 0;
}
//AC at 2018/4/20


题外话:(

休战一个月后的第一道题,手生的很(才不),这道题的灵感还是来自蓝桥的直播课上老师演示的二阶魔方转换题(然而并并不会做)

因为最近一直看python,所以都不会用c++的string了,其中将字符连接起来就伤了我脑筋,不得已用了同样暴力的传进6+个参数的方法。(所谓一暴到底吗)

啊啊好想做后面的题,一直窝在第四章,会来不及看真正有用的算法的,本来以外蓝桥后算法会松一些,但是比赛还有(好事不是吗),我会继续努力的(乖孩子的话语,不喜欢)

原文地址:https://www.cnblogs.com/SuCicada/p/8909024.html

时间: 2024-10-11 04:04:35

uva 253 - Cube painting(相同骰子)的相关文章

uva 253 Cube painting

 Cube painting  We have a machine for painting cubes. It is supplied with three different colors: blue, red and green. Each face of the cube gets one of these colors. The cube's faces are numbered as in Figure 1. Figure 1. Since a cube has 6 faces, o

UVA 253 Cube painting(枚举 模拟)

题意: 按如图的顺序给定2个骰子的颜色(只有r.b.g三种颜色) 问2个骰子是否一模一样 如 可表示为"rbgggr" 和 "rggbgr", 第二个就是绕着Z轴顺时针旋转90度与第一个相同的骰子. 分析: 记录一个错误的做法:并不是只要两面两面互相映射, 如rbrggb 与 rgrgbb, 即使 rb 对应 rb.gb 对应 bg. rg对应rg, 但他们并不是一模一样的骰子.(可以借助真正的骰子旋转尝试一下,就是123456 和 153426, 想象一下2与5互

UVa 253 Cube paiting

题意:输入两个骰子,判断是否等价 因为每一个面可以作顶面,共6*4种情况,枚举就可以了 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<queue> 9 #include<

Cube painting UVA 253

说说:一看到给立方体染色,开始还有点小害怕.毕竟高中数学里染色问题从来都不会简单.这道题的意思就是给立方体的六个面染色,然后判断两个染了色的立方体是否一样.其实仔细一想,立方体无非三对面,若开始确定两对面.如下面图Figure 1所示:假设1,2,6,5这四个面先确定(这只有唯一一种情况)之后,再放3,4,的时候无非两种情况.但这两种情况是不一样的,这也许就是题目所说的reflection.开始的想法是找出三对面,然后比较是否相等即可,不过实在想不出怎样来排除reflection的情况.所以只能

UVA253 Cube painting【置换】

We have a machine for painting cubes. It is supplied with three different colors: blue, red and green. Each face of the cube gets one of these colors. The cube's faces are numbered as in Figure 1. ????Since a cube has 6 faces, our machine can paint a

uva253 Cube painting(UVA - 253)

题目大意 输入有三种颜色判断两个骰子是否相同 思路(借鉴) ①先用string输入那12个字符,然后for出两个骰子各自的字符串 ②这里用的算法是先找出第一个的三个面与第二个的六个面去比较,如果找到相同的面并且他们的对面相等那么继续寻找,直到三个面都能找到相对立的面 ③如果有一个面没有找到相等的面或者相等的对面之类的那么就break循环然后直接判断FALSE如果三个面都能满足上述条件,那么就是TRUE 代码 #include <bits/stdc++.h> using namespace st

UVa 253 骰子涂色

https://vjudge.net/problem/UVA-253 题意:输入两个骰子的六面颜色,判断是否等价. 思路:我最想到的是暴力,不过一直错,也不知道哪里错了.第二种方法就是在一个骰子里出现的一对颜色在第二个骰子也有,只要三对颜色都匹配成功,那么就是等价的. 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 using namespace std; 5 6 char str[20]; 7

UVa 253

背景:一次编译通过加一次ac就是这么爽!!!!!! 思路:枚举六个面朝上,每种情况旋转4次的所有情况,一共24种,全部枚举出来比较即可!这里比较巧妙的是把每一种情况都写作一个长度为6的字符串,并在第七位加一个'\0 ',这样就可以用strcmp来比较了. #include<stdio.h> #include<string.h> int main(void){ char l[7],r[7],temp[13]; l1: while(~scanf("%s",temp)

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes