1 条题解

  • 0
    @ 2025-4-10 1:31:04

    题意分析

    题目要求将四条长度为1212的分子链排列成一个超分子结构,满足:

    1. 四条链可以水平或垂直放置
    2. 保持原始方向不翻转
    3. 中心形成最大非零面积的封闭矩形
    4. 每条链的首尾至少保留11个元素不参与交错

    解题思路

    1. 排列组合:枚举四条链的所有排列方式(4!4!种)
    2. 位置枚举:对每种排列,枚举可能的交错点位置
    3. 面积计算:验证交错点形成的矩形是否合法,并计算最大面积

    实现步骤

    1. 读取四条分子链
    2. 生成所有排列组合(4!4!种)
    3. 对每种排列:
      • 枚举上下链的交错点p[U]p[U]p[L]p[L]
      • 枚举左右链的交错点p[D]p[D]p[R]p[R]
      • 检查形成的矩形是否满足共享分子条件
      • 计算并更新最大面积(l11)×(l21)(l1-1)×(l2-1)
    4. 输出最大面积

    C++实现

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    string s[5]; // 存储四条分子链
    int id[5];    // 排列索引
    int p[5];     // 交错点位置
    enum{U,L,D,R};// 方向枚举:上、左、下、右
    
    int main() {
        while(1) {
            cin>>s[0];
            if(s[0]=="Q") break;
            
            for(int i=1;i<4;i++) cin>>s[i];
            
            for(int i=0;i<4;i++) id[i]=i;
            
            int jg=0; // 最大面积
            
            do {
                for(p[U]=1;p[U]<11;p[U]++) { // 枚举上链的交错点
                    for(p[L]=1;p[L]<11;p[L]++) { // 枚举左链的交错点
                        if(s[id[U]][p[U]]==s[id[L]][p[L]]) { // 检查共享分子
                            for(int l1=2;p[U]+l1<11;l1++) { // 枚举矩形高度
                                for(int l2=2;p[L]+l2<11;l2++) { // 枚举矩形宽度
                                    for(p[D]=1;p[D]+l1<11;p[D]++) { // 枚举下链的交错点
                                        if(s[id[D]][p[D]]==s[id[L]][p[L]+l2]) {
                                            for(p[R]=1;p[R]+l2<11;p[R]++) { // 枚举右链的交错点
                                                if(s[id[R]][p[R]]==s[id[U]][p[U]+l1]) {
                                                    if(s[id[D]][p[D]+l1]==s[id[R]][p[R]+l2]) {
                                                        jg=max(jg,(l1-1)*(l2-1)); // 更新最大面积
                                                    }
                                                } 
                                            }
                                        }
                                    } 
                                }
                            }
                        }
                    }
                } 
            } while(next_permutation(id,id+4)); // 生成下一种排列
            
            cout<<jg<<endl;
        }
        return 0;
    }
    

    代码说明

    1. 输入处理:读取四条分子链,以"QQ"作为结束标志
    2. 排列生成:使用next_permutation生成所有4!4!种排列方式
    3. 交错点枚举
      • p[U]p[U]p[L]p[L]确定左上角共享分子
      • l1l1l2l2确定矩形尺寸
      • p[D]p[D]p[R]p[R]验证右下角共享分子
    4. 面积计算:合法矩形的面积为(l11)×(l21)(l1-1)×(l2-1)
    5. 输出结果:对每个数据集输出最大合法面积

    该解法通过暴力枚举所有可能的排列和交错方式,确保找到最大合法矩形面积。时间复杂度为O(4!×104×102)O(4!×10^4×10^2),在题目约束下可以接受。

    • 1

    信息

    ID
    498
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者