1. 程式人生 > >UVa 1587 Box 盒子

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