日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVA - 1587 Box

發布時間:2024/1/17 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA - 1587 Box 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*起初自己的思路是沒有這么簡潔清晰的,后來做完以后,想要去搜下別人是怎么做的,搜到了這篇bloghttp://blog.csdn.net/kun768/article/details/43701899發現別人的代碼真是清晰又簡潔,于是自己也改寫了自己的代碼,采用了博主的思路,并且加上了一些重載另外,上面那個博客鏈接的代碼,可真是優美,值得一看同時,這也啟發我們,每次oj做完一道題,都應該搜下別人是怎么做的。同樣的代碼,為什么別人就能寫得這么簡潔,時時總結,才會有更大的收獲 */#include <iostream> #include <algorithm> #include <cstring> using namespace std; struct face {int w, h; }a[6]; istream& operator >> (istream&in, face& f) {in >> f.w >> f.h;if (f.w < f.h) swap(f.w, f.h);return in; } bool operator < (const face&e, const face&f) {return (e.w == f.w)?(e.h > f.h):(e.w > f.w); } bool check() {for (int i = 0; i < 6; i += 2)if (memcmp(a + i, a + i + 1, sizeof(face))) return false; // 用memset()函數,比較自定義的結構體數組中的元素,會很簡便 if (a[0].w != a[2].w || a[0].h != a[4].w || a[2].h != a[4].h) return false;return true; }int main() {while (cin >> a[0]){for (int i = 1; i < 6; i++) cin >> a[i];sort(a, a + 6);cout << ( check()? "POSSIBLE":"IMPOSSIBLE" ) << endl;}return 0; }/*另外,后來又找到一串更簡潔的代碼,來自這個blog:http://blog.csdn.net/qq_27474589/article/details/75270349它是利用了pair的自動排序,因為pair默認先按first,再按second排序,所以就不用重載小于號了,算是用pair的一個簡便之處...于是我也自己利用pair寫了一次 */ #include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef pair<int, int> p; p box[6]; bool check() {for (int i = 0; i < 6; i += 2)if (box[i] != box[i + 1]) return false;if (box[2].first != box[4].first || box[4].second != box[0].first || box[0].second != box[2].second) return false;return true; } int main() {while (1){for (int i = 0; i < 6; i++) {// cin >> box[i].first >> box[i].second;// 要能成功退出,而非進入死循環,應該利用scanf的返回值 if (scanf("%d%d",&box[i].first, &box[i].second) != 2) return 0;if (box[i].first < box[i].second) swap(box[i].first, box[i].second);}sort(box, box + 6);cout << ( check()? "POSSIBLE":"IMPOSSIBLE" ) << endl;}return 0; } /* 但是比賽的時候,可能并不能剛好就能想到這么簡便的代碼,這種代碼可以總結時看,但最好還是不要期待,自己在需要臨場應變的時候,也能寫出這么思路清晰又簡潔的代碼還是要熟練掌握,我們一般能直接想到的那種方法,我自己重寫時參考了 http://blog.csdn.net/thudaliangrx/article/details/50699439 */ #include <iostream> #include <cstring> #include <algorithm> using namespace std; int a[12], b[12]; int side[3]; //長方形最多3種邊 int cnt[3]; // 最多三種面 int main() {while(cin >> a[0] >> a[1]){for (int i = 2; i < 12; i++) cin >> a[i];for (int i = 0; i < 12; i += 2)if (a[i] > a[i + 1]) swap(a[i], a[i + 1]); //對每個面的兩條邊,內部交換使得后一條邊更大 memcpy(b, a, sizeof(a));sort(a, a + 12);bool flag = true;for (int i = 0; i < 3; i++){side[i] = a[4 * i];for (int j = 1; j < 4; j++){if (side[i] != a[4 * i + j]){flag = false;break;}}} //保證一共最多3種邊,且每邊4條 if (flag){memset(cnt, 0, sizeof(cnt));for (int i = 0; i < 12; i += 2) //到此處已經滿足:side數組的元素升序排列,對于每個面而言,b數組中,該面較短的一邊在前;于是再來判斷6個面,是否可分為3組,且每組至多兩個 {if( cnt[0] < 2 && b[i] == side[0] && b[i + 1] == side[1]) cnt[0]++;else if ( cnt[1] < 2 && b[i] == side[1] && b[i + 1] == side[2]) cnt[1]++;else if ( cnt[2] < 2 && b[i] == side[0] && b[i + 1] == side[2] ) cnt[2]++;else{flag = false;break;}// 注意一定要有 cnt[0/1/2] < 2這個判斷,否則,當三種邊有兩個相等,或者三個相等的情況,就可能某個cnt為4,而另一個為0,甚至某個cnt為6,其他兩個為0,這種情況其實仍能構成長方形,但如果不加 < 2 的判斷條件,我原先的代碼就會將它作為不滿足處理,導致WA }if (!(cnt[0] == 2 && cnt[1] == 2)) flag = false;}cout << (flag? "POSSIBLE" : "IMPOSSIBLE") << endl;}return 0; }

轉載于:https://www.cnblogs.com/mofushaohua/p/7789547.html

總結

以上是生活随笔為你收集整理的UVA - 1587 Box的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。