View Code of Problem 3928

#include<iostream>
#include<vector>

using namespace std;

typedef struct {
	int w, h;
	int count;
}Paper;

void addPaper(vector<Paper>& data, int w, int h) {
	for (int i = 0; i < data.size(); i++) {
		if ((data[i].w == w && data[i].h == h )|| (data[i].w == h && data[i].h == w)) {
			if (data[i].count < 2) { //【坑】小心正方形的情况
				data[i].count++;
				return; //添加成功
			}
		}
	}
	//未找到,说明是第一次添加
	Paper paper;
	paper.h = h; paper.w = w; paper.count = 1;
	data.push_back(paper);
	return;
}

int judge(vector<Paper>& data) {
	int a, b, c; //长,宽,高
	int t;
	a = data[0].h; //不妨设第0块板的长为长方体的长
	b = data[0].w; //第0块板的宽为长方体的宽
	if (data[1].h == a) { //第1块板的一边与第0块板的一边重合
		c = data[1].w; //第1块板的另一边必为长方体的高,与第2块板的一边重合
		t = b;  //第0块板的另一边必与第2块板的一边重合
	}
	else if (data[1].w == a) {
		c = data[1].h;
		t = b;
	}
	else if (data[1].h == b) {
		c = data[1].w;
		t = a;
	}
	else if (data[1].w == b) {
		c = data[1].h;
		t = a;
	}
	else 
		return 0;
	//第2块板,其中一边必是c,另一边是t
	if (data[2].h == c && data[2].w == t)
		return 1;
	else if (data[2].h == t && data[2].w == c)
		return 1;
	else
		return 0;
}

int main() {
	int w, h;
	while (cin >> w >> h) {
		vector<Paper> data;
		addPaper(data, w, h);
		for (int i = 0; i < 5; i++) {
			cin >> w >> h;
			addPaper(data, w, h);
		}
		//板输入完毕,初步先来判断是否能组成小盒子
		if (data.size() != 3) //没有三种规格的板
			cout << "IMPOSSIBLE" << endl;
		else { //下面再判断三边长能不能组成
			if (judge(data))
				cout << "POSSIBLE" << endl;
			else
				cout << "IMPOSSIBLE" << endl;
		}
	}

	return 0;
}

Double click to view unformatted code.


Back to problem 3928