1 条题解

  • 0
    @ 2025-5-20 21:11:00

    分析题意与解题方法

    题目要求

    给定六个矩形木托盘的尺寸 wwhh,判断这些托盘是否可以组装成一个完整的矩形平行六面体(即一个盒子)。每个托盘只能用于盒子的一个侧面。


    输入与输出

    • 输入:六个矩形托盘的尺寸,每行包含两个整数 wwhh1w,h1041 \leq w, h \leq 10^4)。
    • 输出
      • 如果可以组装成一个盒子,输出 “POSSIBLE”
      • 如果无法组装成一个盒子,输出 “IMPOSSIBLE”

    解题思路

    1. 排序与归类

      • 将每个托盘的尺寸 (w,h)(w, h) 按照 ww 升序排列。
      • 如果 w=ww = w'h=hh = h',则认为这两个托盘相同。
    2. 提取唯一托盘

      • 从排序后的托盘中提取三个唯一的托盘 m0,m1,m2m_0, m_1, m_2 和对应的尺寸 n0,n1,n2n_0, n_1, n_2
    3. 验证条件

      • 确保三个唯一的托盘满足以下条件:
        • 其中两个托盘的 wwhh 相等,表示可以拼接成盒子的相邻侧面。
        • 第三组托盘的 wwhh 必须等于前两组拼接后的边长。
    4. 输出结果

      • 如果所有条件满足,输出 “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
    

    提取唯一托盘

    • m0=683,n0=683m_0 = 683, n_0 = 683
    • m1=683,n1=1345m_1 = 683, n_1 = 1345
    • m2=1345,n2=2584m_2 = 1345, n_2 = 2584

    条件验证

    • m1=m2m_1 = m_2n1=m2n_1 = m_2:满足。
    • m0=m1m_0 = m_1n0=m1n_0 = m_1:满足。
    • 最终验证:a=ba = b,满足。

    因此,输出 “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
    上传者