1 条题解
-
0
分析题意与解题方法
题目要求
给定六个矩形木托盘的尺寸 和 ,判断这些托盘是否可以组装成一个完整的矩形平行六面体(即一个盒子)。每个托盘只能用于盒子的一个侧面。
输入与输出
- 输入:六个矩形托盘的尺寸,每行包含两个整数 和 ()。
- 输出:
- 如果可以组装成一个盒子,输出 “POSSIBLE”。
- 如果无法组装成一个盒子,输出 “IMPOSSIBLE”。
解题思路
-
排序与归类:
- 将每个托盘的尺寸 按照 升序排列。
- 如果 且 ,则认为这两个托盘相同。
-
提取唯一托盘:
- 从排序后的托盘中提取三个唯一的托盘 和对应的尺寸 。
-
验证条件:
- 确保三个唯一的托盘满足以下条件:
- 其中两个托盘的 或 相等,表示可以拼接成盒子的相邻侧面。
- 第三组托盘的 或 必须等于前两组拼接后的边长。
- 确保三个唯一的托盘满足以下条件:
-
输出结果:
- 如果所有条件满足,输出 “POSSIBLE”。
- 否则,输出 “IMPOSSIBLE”。
示例分析
输入数据
1345 2584 2584 683 2584 1345 683 1345 683 1345 2584 683
排序后
683 683 683 1345 1345 2584 2584 683 2584 1345 2584 2584
提取唯一托盘
条件验证
- 或 :满足。
- 或 :满足。
- 最终验证:,满足。
因此,输出 “POSSIBLE”。
代码实现
#include <iostream> using namespace std; int main() { int x[6], y[6]; for (int i = 0; i < 6; i++) { int a, b; cin >> a >> b; // 确保 w <= h if (a > b) { int t; t = a; a = b; b = t; } x[i] = a; y[i] = b; } // 排序 for (int i = 0; i < 6; i++) { for (int j = i + 1; j < 6; j++) { if (x[i] > x[j]) { int t1, t2; t1 = x[i]; t2 = y[i]; x[i] = x[j]; y[i] = y[j]; x[j] = t1; y[j] = t2; } else if ((x[i] == x[j]) && (y[i] > y[j])) { int t1, t2; t1 = x[i]; t2 = y[i]; x[i] = x[j]; y[i] = y[j]; x[j] = t1; y[j] = t2; } } } // 提取唯一托盘 int m[3], n[3]; int js = 0; for (int i = 0; i < 6;) { if ((x[i] == x[i + 1]) && (y[i] == y[i + 1])) { m[js] = x[i]; n[js] = y[i]; js++; } i += 2; } // 验证条件 int jg = 0; int a = 0, b = 0; if (js == 3) { if ((m[0] == m[1]) || (n[0] == m[1])) { jg++; a = n[1]; } else if ((m[0] == n[1]) || (n[0] == n[1])) { jg++; a = m[1]; } if ((m[0] == m[2]) || (n[0] == m[2])) { jg++; b = n[2]; } else if ((m[0] == n[2]) || (n[0] == n[2])) { jg++; b = m[2]; } if (a == b) { jg++; } } if (jg == 3) { cout << "POSSIBLE"; } else { cout << "IMPOSSIBLE"; } return 0; }
- 1
信息
- ID
- 1161
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者