题意:
包含6个原子和5个化学键的烷烃基共有5种,用1-6标号6个原子,然后用一对数字a,b表示原子a和原子b之间有一个化学键。给定5行a,b,判断出它的类别,输出其化学名称(见下图)。原子没有标号方法,即同一个原子可能标号为1,也可能为2,依次类推。
思路:
首先找出5种类别之间较大的区别:n-类的各原子键数分别为1,2,2,2,2,1,即有2个1键原子,4个2键原子;2-类和3-类都有3个1键原子,2个2键原子,1个3键原子,需要特判;2,3-类有4个1键原子和2个3键原子;2,2-类有4个1键原子,1个2键原子和1个4键原子。
于是应先计算出所给烷烃基各个原子的键数,如果是2-类或3-类要特判:找到其3键原子,判断其三端共有几个2键原子或3键原子。(也可以通过判断三端的1键原子个数来得出结论)若有2个2(3)键原子,则为3-类;若有1个2(3)键原子,则为2-类。
计算原子键数时,先将5个化学键的两端原子存入a[5]和b[5]中,然后用yuanzi[7]数组来遍历计算6个原子对应键的个数。后用jian[5]数组来计算i键原子有多少个。之后便是判断部分。
2-类与3-类的特判:首先找到3键原子,记为middle,然后在化学键的两端原子中寻找它邻接的另一个原子,记为next,然后遍历寻找next的邻接原子(且不为middle),如果有,则next为2(3)键原子,sum++。找完middle的三端原子后,根据2(3)键原子个数sum判断即可。
总结:
一道模拟题,首先要读懂题,找出5种类别之间的较大区别,然后根据这种区别来做题。
代码:
#include <iostream>
using namespace std;
int main()
{
long long int T;
cin>>T;
for(int i=0; i<T; i++)
{
int a[5],b[5];
for(int j=0; j<5; j++)
cin>>a[j]>>b[j];
int yuanzi[7]={0,0,0,0,0,0,0}; //6个原子对应键的个数
for(int j=0; j<5; j++)
{
yuanzi[a[j]]++;
yuanzi[b[j]]++;
}
int jian[5]= {0,0,0,0,0}; //键为i个的原子个数
for(int j=1; j<7; j++)
{
if(yuanzi[j]==1) jian[1]++;
else if(yuanzi[j]==2) jian[2]++;
else if(yuanzi[j]==3) jian[3]++;
else if(yuanzi[j]==4) jian[4]++;
}
//判断
if(jian[1]==2&&jian[2]==4) cout<<"n-hexane"<<endl;
else if(jian[1]==4&&jian[2]==1&&jian[4]==1) cout<<"2,2-dimethylbutane"<<endl;
else if(jian[1]==4&&jian[3]==2) cout<<"2,3-dimethylbutane"<<endl;
else //判断2-还是3-,找到3键原子,判断其三端各有几个原子
{
int middle; //3键原子
for(int j=1; j<7; j++)
if(yuanzi[j]==3)
middle=j;
int sum=0; //3端共有几个2(3)原子
for(int j=0; j<5; j++)
{
int next;
if(a[j]==middle||b[j]==middle)
{
if(a[j]==middle) next=b[j];
else next=a[j];
for(int k=0; k<5; k++)
if((a[k]==next&&b[k]!=middle)||(b[k]==next&&a[k]!=middle))
{
sum++;
break;
}
}
}
if(sum==2) cout<<"3-methylpentane"<<endl;
else if(sum==1) cout<<"2-methylpentane"<<endl;
}
}
}