《演算法競賽入門經典》 習題3-10 盒子
阿新 • • 發佈:2018-12-15
《演算法競賽入門經典》 習題3-10 盒子
給定6個矩形的長和寬wi和hi(1<=wi,hi<=1000),判斷它們能否構成長方體的6個面。
#include<stdio.h> #include<algorithm> //呼叫swap,sort函式 using namespace std; typedef struct //定義關於寬高的結構體 { int w,h; }box; bool cmp(box a,box b) //定義了cmp,用於比大小排序 { return a.w<b.w||(a.w==b.w&&a.h<b.h); } int main() { box b[6]; while(scanf("%d %d",&b[0].w,&b[0].h)!=EOF) //輸入第一組寬高 { if(b[0].w>b[0].h) //如果寬大於高,交換,便於後續6組進行排序 swap(b[0].w,b[0].h); int flag=1; for(int i=1;i<=5;i++) //輸入剩下5組 { scanf("%d %d",&b[i].w,&b[i].h); if(b[i].w>b[i].h) swap(b[i].w,b[i].h); } sort(b,b+6,cmp); //6組進行字典序排序 for(int i=0;i<5;i+=2) { if(b[i].w!=b[i+1].w||b[i].h!=b[i+1].h) //排序後,一定要有兩組數字一樣,不然不能構成長方體 { flag=0; break; } } if(b[0].w!=b[2].w||b[0].h!=b[4].w||b[2].h!=b[4].h) //舉個例子就知道了,比如2 3,2 3,2 4,2 4,3 4,3 4 flag=0; printf(flag?"POSSIBLE\n":"IMPOSSIBLE\n"); } return 0; }
(我寫的好麻煩啊,嗯……就是舉幾個例子,排一排)
(ヘアピンを買った)