题目描述
化学很神奇,以下是烷烃基。
假设如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基
你的任务是甄别烷烃基的类别。
原子没有编号方法,比如
1 2
2 3
3 4
4 5
5 6
和
1 3
2 3
2 4
4 5
5 6
是同一种,本质上就是一条链,编号其实是没有关系的,可以在纸上画画就懂了
输入
输入第一行为数据的组数T(1≤T≤200000)。每组数据有5行,每行是两个整数a, b(1≤a,b≤6,a ≤b) 数据保证,输入的烷烃基是以上5种之一 |
输出
每组数据,输出一行,代表烷烃基的英文名 |
样例输入
2 1 2 2 3 3 4 4 5 5 6 1 4 2 3 3 4 4 5 5 6 |
样例输出
n-hexane 3-methylpentane |
思路
综述
观察这五种物质,发现:通过碳原子拥有化学键个数可以区分
不同点:
n-hexane:有四个碳原子有两个化学键
2-methylpentane:一个碳原子三个化学键,两个碳原子两个化学键并且该两个碳原子相连
3-methylpentane:一个碳原子三个化学键,两个碳原子两个化学键并且该两个碳原子不相连
2,3-dimethylbutane:有两个碳原子有三个化学键
2,2-dimethylbutane:有一个碳原子有四个化学键
过程
step1:
接收输入,并且a数组表示某碳原子拥有化学键个数
for(j=1;j<6;j++){
cin>>x[j]>>y[j];
a[x[j]]++;
a[y[j]]++;
}
step2:
遍历a数组,记录六个碳原子中,拥有一个化学键的原子个数,拥有两个化学键的原子个数…
for(j=1;j<=6;j++){
if(a[j]==1)n1++;
if(a[j]==2)n2++;
if(a[j]==3)n3++;
if(a[j]==4)n4++;
}
step3:
如下判断可以直接辨别三种化合物,否则进入第四步
if(n4==1) cout<<"2,2-dimethylbutane"<<endl;
else if(n1==2 && n2==4) cout<<"n-hexane"<<endl;
else if(n1==4 && n3==2) cout<<"2,3-dimethylbutane"<<endl;
step4:
其余两种物质可以如此区分:找到这个拥有三个化学键的原子,判断与其相连的三个原子拥有的化学键的总个数来区分
step4.1
找到该拥有三个化学键的原子
for(j=1;j<=6;j++){
if(a[j]==3){
goal = j;
break;
}
}
step4.2
找到与该三化学键原子相连的另外三个原子,记录到数组m中
num=0;
for(j=1;j<=6;j++)
if(x[j]==goal){
m[num]=y[j];
num++;
}
for(j=1;j<=6;j++)
if(y[j]==goal){
m[num]=x[j];
num++;
}
step4.3
计算另外三个原子的所有化学键的总个数并且做出判断
total = a[m[1]]+a[m[2]]+a[m[3]];
if(total==4)cout<<"2-methylpentane"<<endl;
else cout<<"3-methylpentane"<<endl;
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> a(7);
int x[6],y[6];//接收输入数据
int t,n,m,j,i,k;
int n1,n2,n3,n4;//用于记录化合物中化学键分别为1\2\3\4 的碳原子个数
cin>>t;
// 初始化
for(i=0;i<t;i++){
n1=n2=n3=n4=0;
for(k=0;k<=6;k++)
a[k]=0;
//接收输入,并且a数组表示某碳原子拥有化学键个数
for(j=1;j<6;j++){
cin>>x[j]>>y[j];
a[x[j]]++;
a[y[j]]++;
}
// 遍历a数组,记录六个碳原子中,拥有一个化学键的原子个数,拥有两个化学键的原子个数......
for(j=1;j<=6;j++){
if(a[j]==1)n1++;
if(a[j]==2)n2++;
if(a[j]==3)n3++;
if(a[j]==4)n4++;
}
//如下判断可以直接辨别三种化合物,
if(n4==1) cout<<"2,2-dimethylbutane"<<endl;
else if(n1==2 && n2==4) cout<<"n-hexane"<<endl;
else if(n1==4 && n3==2) cout<<"2,3-dimethylbutane"<<endl;
else {
// 找到该拥有三个化学键的原子
int m[4],goal,num;
for(j=1;j<=6;j++){
if(a[j]==3){
goal = j;
break;
}
}
// 找到与该三化学键原子相连的另外三个原子,记录到数组m中
num=1;
for(j=1;j<=6;j++)
if(x[j]==goal){
m[num]=y[j];
num++;
}
for(j=1;j<=6;j++)
if(y[j]==goal){
m[num]=x[j];
num++;
}
// 计算另外三个原子的所有化学键的总个数并且做出判断
int total=0;
total = a[m[1]]+a[m[2]]+a[m[3]];
if(total==4)cout<<"2-methylpentane"<<endl;
else cout<<"3-methylpentane"<<endl;
}
}
}