
UVA253 骰子涂色 Cube painting题目描述PDF输入格式输出格式输入输出样例 #1输入 #1rbgggrrggbgr rrrbbbrrbbbr rbgrbgrrrrrg输出 #1TRUE 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.colorStrs;}publicSetStringoppositePlane(){SetStringplaneSetnewHashSet();charc1colorStr.charAt(0);charc6colorStr.charAt(5);Strings1(c1c6)?c1c6:c6c1;planeSet.add(s1);charc2colorStr.charAt(1);charc5colorStr.charAt(4);Strings2(c2c5)?c2c5:c5c2;planeSet.add(s2);charc3colorStr.charAt(2);charc4colorStr.charAt(3);Strings3(c3c4)?c3c4:c4c3;planeSet.add(s3);returnplaneSet;}publicbooleanisSame(Cubecube2){returnthis.oppositePlane().equals(cube2.oppositePlane());}}publicclassCubePainting{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);while(sc.hasNext()){Stringlinesc.next();Stringcube1line.substring(0,6);Stringcube2line.substring(6,12);CubecubeAnewCube(cube1);CubecubeBnewCube(cube2);booleanresultcubeA.isSame(cubeB);if(result){System.out.println(true);}else{System.out.println(false);}}sc.close();}}