UVA刷题方法:https://blog.csdn.net/richenyunqi/article/details/80990535#commentBox
【2019.3.26】
本来觉得这题好简单,结果是WA,发现思路全错,做了将近两个小时,最后AC的代码也不好看,郁闷
思路:
每行的输入用a和b存储,保证a<b
六个数字对用num[6][2]数组存储,保证num[][0]<num[][1]
最后将num数组排序,也就是将六个数对排序:
先看第一维:(1,2)排在(2,3)前面
如果第一维相同,则看第二维:(1,2)排在(1,3)前面
如果可以组成长方体的话,最终排好序的数组应该是下面这样的:
x y
x y
x z
x z
y z
y z
其中,x<y<z
如果排好序的num数组不是上面的形式,则IMPOSSIBLE
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int num[6][2];
int main()
{
//freopen("C:\\Users\\Summer\\Desktop\\input.txt","r",stdin);
//freopen("C:\\Users\\Summer\\Desktop\\output.txt","w",stdout);
int a,b;
int cnt=0;
while(scanf("%d %d", &a, &b)!=EOF) {
if(a>b) swap(a,b); //保证a<b
num[cnt][0]=a;
num[cnt][1]=b;
cnt++;
//当输完第6组数字时,判断
if(cnt==6) {
cnt=0;
//冒泡排序
for(int i=0; i<6; i++) {
for(int j=i+1; j<6; j++) {
if((num[j][0]<num[i][0])||
(num[j][0]==num[i][0] && num[j][1]<num[i][1])) {
swap(num[j][0], num[i][0]);
swap(num[j][1], num[i][1]);
}
}
}
/*
for(int i=0; i<6; i++)
for(int j=0; j<2; j++)
cout<<num[i][j]<<' ';
*/
//检查并输出
bool flag=true;
int x;
//检查最小的四个数是否相等
x=num[0][0];
for(int i=1; i<4; i++)
if(x!=num[i][0])
flag=false;
//检查中间的四个数是否相等
x=num[4][0];
if(x!=num[5][0] || x!=num[0][1] || x!=num[1][1])
flag=false;
//检查最大的四个数是否相等
x=num[2][1];
for(int i=3; i<6; i++)
if(x!=num[i][1])
flag=false;
//输出
if(flag) cout<<"POSSIBLE"<<endl;
else cout<<"IMPOSSIBLE"<<endl;
}
}
return 0;
}