题目描述:
化学很神奇,以下是烷烃基。
假设如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基
你的任务是甄别烷烃基的类别。
原子没有编号方法,比如12 23 34 45 56和13 23 24 45 56是同一种,本质上就是一条链,编号其实是没有关系的,可以在纸上画画就懂了。
可以运用暴力解法,题目只需要我们鉴别这五种烷烃基,故找出这五种烃基的区别即可,即对于每一种烷烃基,找出能唯一区分它的特征。
解题思路;
我的区分方法是“原子邻居法”,即找出六个原子中最受欢迎的原子(即与之相连的原子最多),称之为原子C位(原子C位可能不止一个),原子C位的邻居数为C邻居数,此外,端原子(只有一个邻居)也是一种辅助区分方法,仔细观察这五种烷烃基,可以发现:
n-hexane的C邻居数为2,
2,2-dimethylbutane的C邻居数为4
其余三种的C邻居数为3
如何区分这三种呢,
2,3-dimethylbutane有两个原子C位
3-methylpentane的原子C位有1个端原子邻居
2-methylpentane的原子C位有2个端原子邻居
至此,五种烷烃基能够完全区分。
(区分方法还有很多,思考还能得出很多种原子邻居区分法)
实验代码:
```cpp
#include<iostream>
using namespace std;
int main(void)
{
int n,a,b;
cin>>n;//总共输入n组数据
for(int i=0;i<n;i++)
{
bool arr_[7][7]={0}; //数组表示两两原子间是否相连
int arr[7]={0}; //记录每个原子与多少个原子相连
for(int i=0;i<5;i++)
{
cin>>a>>b;
arr_[a][b]=1;
arr_[b][a]=1;
arr[a]++;
arr[b]++;
}
//找出max
int max=0; //记录C邻居数
int maxnum=1; //记录原子C位个数
int maxi=0; //记录原子C位序号
for(int i=0;i<=6;i++)
{
if(arr[i]>max)
{
max=arr[i];
maxnum=1;
maxi=i;
}
else if(arr[i]==max)
maxnum++;
}
//判断
if(max==2)
cout<<"n-hexane"<<endl;
else if(max==4)
cout<<"2,2-dimethylbutane"<<endl;
else //max==3
{
if(maxnum==2)
cout<<"2,3-dimethylbutane"<<endl;
else
{
int a1=0; //记录端原子个数
for(int j=1;j<=6;j++)
if(arr_[maxi][j]==1&&arr[j]==1)
a1++;
if(a1==1)
cout<<"3-methylpentane"<<endl;
else
cout<<"2-methylpentane"<<endl;
}
}
}
return 0;
}