1 条题解
-
0
题意分析
题目要求将四条长度为的分子链排列成一个超分子结构,满足:
- 四条链可以水平或垂直放置
- 保持原始方向不翻转
- 中心形成最大非零面积的封闭矩形
- 每条链的首尾至少保留个元素不参与交错
解题思路
- 排列组合:枚举四条链的所有排列方式(种)
- 位置枚举:对每种排列,枚举可能的交错点位置
- 面积计算:验证交错点形成的矩形是否合法,并计算最大面积
实现步骤
- 读取四条分子链
- 生成所有排列组合(种)
- 对每种排列:
- 枚举上下链的交错点和
- 枚举左右链的交错点和
- 检查形成的矩形是否满足共享分子条件
- 计算并更新最大面积
- 输出最大面积
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; }
代码说明
- 输入处理:读取四条分子链,以""作为结束标志
- 排列生成:使用
next_permutation
生成所有种排列方式 - 交错点枚举:
- 和确定左上角共享分子
- 和确定矩形尺寸
- 和验证右下角共享分子
- 面积计算:合法矩形的面积为
- 输出结果:对每个数据集输出最大合法面积
该解法通过暴力枚举所有可能的排列和交错方式,确保找到最大合法矩形面积。时间复杂度为,在题目约束下可以接受。
- 1
信息
- ID
- 498
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者