题意
假设如下图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基 .输入多组数据,判断是下面哪种烷烃基.
思路
- 通过对五种烷烃基的分析,发现每一个烷烃基中原子的化学键的个数差异可以唯一确定3个烷烃基,n-hexane(存在原子拥有的最多化学键为2个),2-3-dimethybutane(其中有两个原子的化学键个数最为3个),2-2-dimethybutane(存在原子拥有的最多化学键的个数为4个)
- 对于2-methylpentane和3-methylpentane,两个原子化学键的个数差异不能区别这两个烷烃基,通过图示分析,3-methylpentane存在一个三键原子和两个二键原子相连,而2-methylpentane不存在这样的规律,通过这个就可以区别这两个烷烃基,对比于其他三个烷烃基,这两个烷烃基只存在一个原子的化学键最多为3个,可以区分.
- 根据输入的格式,五行a,b.可以选择将其存储在一个二维数组,为一个图.在输入的过程中,将每一个烷烃基的每一个原子所拥有的化学键个数计算出来,存入一维数组,进行升序排序,判断原子最多化学键的个数,可以直接确定前三个烷烃基,也将后面两个烷烃基分开,然后进行相邻判断,由于3-methylpentane的三键原子和两个二键原子相连,进而判断出这两个.
总结
这道题主要是需要仔细观察这五幅图中的烷烃基,找出区别这五种烷烃基的关键之处,主要难点就是如何区分2-methylpentane和3-methylpentane这两个烷烃基,这两个非常相似,给予迷惑性.
数据的输入直接使用二维数组,将存在化学键表示为 1,不存在为0 ,可以说是设置障碍,为以后的遍历提供便利.
代码
#include<iostream>
#include<queue>
#include<algorithm>
struct C_number {
int x;
int y;
bool operator<(const C_number & C) {
return x<C.x;
}
};
using namespace std;
class graph {
private:
int **b;
struct C_number *c1;
public:
graph() {
b=new int*[7];
for(int i=1; i<=6; i++)
b[i]=new int[7];
for(int i=1; i<=6; i++) {
for(int j=1; j<=6; j++) {
b[i][j]=0;
}
}
c1=new struct C_number[7];
for(int i=1; i<7; i++)
c1[i].x=0,c1[i].y=i;
}
void intput() {
int n,m,temp=0;
while(temp!=5&&cin>>n>>m) {
for(int i=1; i<=6; i++) {
for(int j=1; j<=6; j++) {
if(n==i&&m==j)
b[i][j]=1,b[j][i]=1,c1[i].x++,
c1[j].x++;
}
}
temp++;
}
}
void judge() {
sort(c1+1,c1+7);
//for(int i=1;i<=6;i++)
//cout<<c1[i].y<<" "<<c1[i].x;
//cout<<endl;
if(c1[6].x==3&&c1[5].x==2) {
int p=c1[6].y;
int q=c1[5].y;
int q1=c1[4].y;
if(b[p][q]==1&&b[p][q1]==1)
cout<<"3-methylpentane"<<endl;
else
cout<<"2-methylpentane"<<endl;
return;
}
if(c1[6].x==2) {
cout<<"n-hexane"<<endl;
return;
}
if(c1[6].x==4) {
cout<<"2,2-dimethylbutane"<<endl;
return;
}
if(c1[6].x==3&&c1[5].x==3) {
cout<<"2,3-dimethylbutane"<<endl;
return;
}
}
};
int main() {
int n;
cin>>n;
for(int i=0; i<n; i++) {
graph a;
a.intput();
a.judge();
}
return 0;
}