UVA253 骰子涂色 Cube painting

UVA253 骰子涂色 Cube painting

UVA253 骰子涂色 Cube painting

题目描述

PDF

输入格式

输出格式

输入输出样例 #1

输入 #1

rbgggrrggbgr rrrbbbrrbbbr rbgrbgrrrrrg

输出 #1

TRUE FALSE FALSE

题目大意

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

例如rbgggr和rggbgr分别表示下面两幅图的两个骰子。两者是等价的,因为图1中所示的骰子沿着竖直轴旋转90°之后就可以得到图2所示的骰子。

输入格式

程序的输入是一个文本文件,文件以标准文件结束符收尾,文件中每一行都是 12 个字符组成的字符串:前 6 个字符代表第一个涂色立方体,后 6 个字符代表第二个涂色立方体,程序需要判断两个立方体是否属于同一种涂色方案,也就是能否通过若干次旋转操作,将其中一个立方体变成另一个,不允许使用镜像翻转操作。

输出格式

程序输出由布尔结果组成的文本,每一行输入对应一行输出:如果第二个立方体字符串能通过旋转第一个立方体得到则输出 TRUE,否则输出 FALSE。

解题思路

立方体六个面固定分为三组对立面,分别是 1 对 6、2 对 5、3 对 4,输入的六位字符串下标 0 至 5 刚好一一对应这六个面。读取两个立方体对应的字符串后,分别提取各自三组对立面的颜色配对,每组内两种颜色不分先后,统一将 ASCII 码更小的字符放在前面拼接成字符串存入集合,以此消除颜色顺序带来的差异。之后对比两个立方体生成的集合,若两组集合内的三组配对完全一致,则代表两个立方体能够通过旋转互相转换,输出 TRUE;若集合内容存在差异,无论如何旋转都无法让两个立方体外观一致,直接输出 FALSE。

完整代码

importjava.util.HashSet;importjava.util.Scanner;importjava.util.Set;classCube{privateStringcolorStr;publicCube(Strings){this.colorStr=s;}publicSet<String>oppositePlane(){Set<String>planeSet=newHashSet<>();charc1=colorStr.charAt(0);charc6=colorStr.charAt(5);Strings1=(c1<c6)?c1+""+c6:c6+""+c1;planeSet.add(s1);charc2=colorStr.charAt(1);charc5=colorStr.charAt(4);Strings2=(c2<c5)?c2+""+c5:c5+""+c2;planeSet.add(s2);charc3=colorStr.charAt(2);charc4=colorStr.charAt(3);Strings3=(c3<c4)?c3+""+c4:c4+""+c3;planeSet.add(s3);returnplaneSet;}publicbooleanisSame(Cubecube2){returnthis.oppositePlane().equals(cube2.oppositePlane());}}publicclassCubePainting{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);while(sc.hasNext()){Stringline=sc.next();Stringcube1=line.substring(0,6);Stringcube2=line.substring(6,12);CubecubeA=newCube(cube1);CubecubeB=newCube(cube2);booleanresult=cubeA.isSame(cubeB);if(result){System.out.println("true");}else{System.out.println("false");}}sc.close();}}