UVa 1587 Box 盒子
這道題的連結:https://vjudge.net/problem/UVALive-3214
給定6個矩形的長和寬wi與hi(1<=wi, hi<=1000), 判斷它們能否構成長方體的6個面
Sample Input
1345 2584
2584 683
2584 1345
683 1345
683 1345
2584 683
1234 4567
1234 4567
4567 4321
4322 4567
4321 1234
4321 1234
Sample Output
POSSIBLE
IMPOSSIBLE
這道題是給6個面來判斷能否構成長方體的6個面
那麼我們不妨先思考一下長方體的6個面具有什麼特徵
比如一個長寬高分別為a, b, c的長方體,a, b, c之間的大小關係未知
那麼6個面分別為ab, ab, ac, ac, bc, bc
對於普通(a, b, c之間的大小關係未知)的情況我們發現一定會有兩個面是相同的,而且有三組這樣的兩個面(ab, ab為一組, bc, bc為一組,ac, ac為一組)
得到了這樣的關係後我們就可以進行判斷題目中所給的6個面是否能夠構成長方體了
具體怎麼實現的呢:
1.首先將6個面進行排序,根據6個面的長進行排序,如果長相等時,那麼根據寬邊的大小進行排序
2.得到了排好順序後的6個面後,我們需要進行判斷,怎麼判斷呢?如果6個面可以構成長方體的話
那麼排列好的順序為(a1, b1)(a1, b1), (a1, c1), (a1, c1), (c1, b1), (c1, b1)(a1 >= c1 >= b1)
所以我們判斷第一個面與第二個面是否相同, 第三個面與第四個面是否相同,第五個面與第六個面是否相同
然後再判斷有幾個不同的數,用count(計數器)計數,如果count <= 3就OK了(自己想一想為什麼)
總結來看我們的程式碼包括以下幾個模組:
1.排序
2.兩個兩個的比對
3.count <= 3
下面是程式碼:
//UVa 1587 Box //yifei Wa #include<stdio.h> #include <string.h> #define maxn 10 int a[maxn], b[maxn], count; //count計數器 void swap(int& i, int& j) { int t = i; i = j; j = t; } void sort() { for(int i = 0; i < 5; i++) for(int j = i+1; j < 6; j++) if(a[i] < a[j]) { swap(a[i], a[j]); swap(b[i], b[j]); } else if(a[i] == a[j] && b[i] < b[j]) { swap(a[i], a[j]); swap(b[i], b[j]); } } bool check_2() { //兩個兩個的比對 int flag = 0; for(int i = 0; i <= 4; i+=2) if(a[i] != a[i+1] || b[i] != b[i+1]) { flag = 1; break; } if(flag) return 0; int num[20]; memset(num, 0, sizeof(num)); num[++count] = a[0]; for(int i = 0; i < 6; i++) { flag = 0; for(int j = 0; j <= count; j++) if(num[j] == a[i]) { flag = 1; break; } if(!flag) num[++count] = a[i]; } for(int i = 0; i < 6; i++) { flag = 0; for(int j = 0; j <= count; j++) if(num[j] == b[i]) { flag = 1; break; } if(!flag) num[++count] = b[i]; } return 1; } int main() { while(scanf("%d%d", &a[0], &b[0]) != EOF) { if(a[0] < b[0]) swap(a[0], b[0]); count = 0; for(int i = 1; i < 6; i++) { scanf("%d%d", &a[i], &b[i]); if(a[i] < b[i]) swap(a[i], b[i]); } sort(); //排序 if(check_2() && count <= 3) printf("POSSIBLE\n"); else printf("IMPOSSIBLE\n"); } return 0; }
相信大家一定能夠明白這道題的,這道題不難,主要還是想清楚長方體的特徵,看清事物的本質再來寫程式碼。
如果有什麼錯誤的可以評論告訴我,我會及時修正的。
轉載請表明出處。
2018年12月14日
yifei Wa