題意很簡單,給六個面判斷是否能組成一個長方體。
教訓:這類考察思維而不是程式碼能力的(ACM基本都是這樣)題目,要基於題目特性去思考,善於發現物體的特徵,再根據特徵來寫解題方法。
思路:根據長方體特性,將其每個面的資料調整為長在前,寬在後,便於比較,而後根據長和寬來排序,如果兩個面長相等就看寬。排序後觀察,利用其資料特點來解題。
例:排序後3 2 3 2 3 1 3 1 2 1 2 1。
前四個面長相等,後四個面寬相等。前兩個面的寬是最後兩個面的長。
程式碼:
#include<bits/stdc++.h> using namespace std; struct box{ int x,y; }a[6]; bool cmp(const box a,const box b) { return a.x==b.x?a.y>b.y:a.x>b.x; } int main() { while(cin>>a[0].x>>a[0].y) { int ans=1; if(a[0].x<a[0].y) swap(a[0].x,a[0].y); for(int i=1;i<6;i++) { cin>>a[i].x>>a[i].y; if(a[i].x<a[i].y) swap(a[i].x,a[i].y); } sort(a,a+6,cmp); if(memcmp(a,a+1,sizeof(box))||memcmp(a+2,a+3,sizeof(box))||memcmp(a+4,a+5,sizeof(box)))//memcmp排序,按空間中字元比較,相等返回0. ans=0; if(a[0].x!=a[2].x||a[2].y!=a[4].y||a[0].y!=a[4].x) ans=0; if(ans) cout<<"POSSIBLE"<<endl; else cout<<"IMPOSSIBLE"<<endl; } return 0; }