UVA1587 -盒子 Box 面向对象
UVA1587 盒子 Box题目大意伊万在一家生产重型机械的工厂工作他的工作很简单钉制不同尺寸的木箱用来封装机械发给客户。每个箱子都是长方体制作一个箱子需要六块矩形木板每块木板对应长方体的一个面。乔负责给伊万运送木板但他做事马虎经常送错木板凑不成完整的箱子可乔又不信任伊万每次伊万都要花大量时间和他解释木板不对。好在乔十分相信计算机觉得程序绝不会出错于是伊万让你写一个程序给定六块矩形木板的尺寸判断这六块木板能否拼接成一个完整长方体箱子。输入输入包含多组测试用例每组用例共 6 行数据每行代表一块木板包含两个整数 w 和 h1 ≤ w、h ≤ 10000分别代表木板的宽和高单位毫米。输出每组测试用例单独输出一行结果如果六块木板能拼成完整长方体输出单词POSSIBLE无法拼成则输出IMPOSSIBLE。解题思路先自定义长方形类封装木板长宽构造方法自动把每块木板统一处理成短边在前、长边在后的格式配套方法获取边长、判断两块木板是否完全相同接着读取六块木板的长宽数据逐个创建长方形对象存入数组调用工具对全部木板整体排序优先对比短边短边一致再对比长边尺寸更小的木板排在前面排序完成后校验木板能否刚好分成三组两两完全相同的板面只要有一组不匹配就直接判定无法拼成长方体再提取三组不重复的板面收集全部六条边长并排序从中提取最小、中间、最大三组边长生成长方体理论上必须具备的三类标准板面最后循环比对实际三组板面和标准板面统计匹配成功的数量只有三类板面全部匹配上才说明这些木板可以拼接成长方体反之判定无法拼接。完整代码importjava.util.Arrays;importjava.util.Scanner;classRectangle{privateinta;privateintb;publicRectangle(inta,intb){if(ab){this.aa;this.bb;}else{this.ab;this.ba;}}publicintgetA(){returna;}publicintgetB(){returnb;}publicbooleanisSame(Rectangleother){returnthis.aother.athis.bother.b;}}publicclassBox1{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);while(sc.hasNext()){Rectangle[]planenewRectangle[6];for(inti0;i6;i){intasc.nextInt();intbsc.nextInt();plane[i]newRectangle(a,b);}Arrays.sort(plane,(r1,r2)-{if(r1.getA()!r2.getA()){returnr1.getA()-r2.getA();}else{returnr1.getB()-r2.getB();}});booleanflagtrue;if(!plane[0].isSame(plane[1])){flagfalse;}if(!plane[2].isSame(plane[3])){flagfalse;}if(!plane[4].isSame(plane[5])){flagfalse;}Rectangler1plane[0];Rectangler2plane[2];Rectangler3plane[4];int[]side{r1.getA(),r1.getB(),r2.getA(),r2.getB(),r3.getA(),r3.getB()};Arrays.sort(side);intxside[0];intyside[2];intzside[4];Rectangle[]standard{newRectangle(x,y),newRectangle(x,z),newRectangle(y,z)};Rectangle[]test{r1,r2,r3};intmatch0;for(inti0;i3;i){for(intj0;j3;j){if(test[i].isSame(standard[j])){match;break;}}}if(match!3){flagfalse;}if(flag){System.out.println(POSSIBLE);}else{System.out.println(IMPOSSIBLE);}}sc.close();}}