1. 程式人生 > >《演算法競賽入門經典》 習題3-10 盒子

《演算法競賽入門經典》 習題3-10 盒子

《演算法競賽入門經典》 習題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; 
}

(我寫的好麻煩啊,嗯……就是舉幾個例子,排一排)
(ヘアピンを買った)