UVA - 1587 Box
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当session会话结束时,重定向到登录
- 下一篇: Selenium with Python