问题描述:
化学很神奇,以下是烷烃基。
假设如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基。你的任务是甄别烷烃基的类别。
input:
输入第一行为数据的组数T(1≤T≤200000)。每组数据有5行,每行是两个整数a, b(1≤a,b≤6,a ≤b),数据保证,输入的烷烃基是以上5种之一
output:
每组数据,输出一行,代表烷烃基的英文名
解题思路:
首先,对于输出,我们可以很容易的得到每一个原子相连几个化学键,然后通过观察分析,以上5中同分异构体可以分为4大类,通过与两个化学相连的原子个数有几个来分类,n-hexane有四个与两个化学键相连的原子,2,2-dimethylbutane有一个与两个化学键相连的原子,2,3-dimethylbutane不存在与两个化学键相连的原子,而其余两个,都有两个与两个化学键相连的原子,所以剩余的任务就是找到这两类的不同之处。
通过观察,我们发现
这两个结构在画红线的原子那里结构是不同的,一个与两个 有与两个化学键相连的原子 进行连接,而另一个只有一个,则我们可以通过它们相连的原子有几个是有两个化学键相连的来进行判断。
首先我们可以定义一个二维数组,来存储我们的输入,然后在输入的过程中,计算与两个化学相连的原子个数,这样就可以分出三类,然后若不能够通过与两个化学相连的原子个数来判断,则通过循环找到与三个化学键相连的原子,然后找到两个与两个化学键相连的原子,然后在遍历输入的矩阵,看是否这两个原子都与同一个原子相连,如果是,就为3-methylpentane,否则为2-methylpentane。
解题总结:
对于这种题目,重要的是找到每一种结构的差别,然后可以根据这一差别,来分别出每一种结构。
代码:
#include<iostream>
using namespace std;
int a[7]; //记录每个数出现的次数
int main()
{
int store[5][2];//记录输入的数据
int temp=0;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
for(int i=1;i<=6;i++)
{
a[i]=0;//初始化
}
for(int i=0;i<5;i++)
{
int b,c;
cin>>b>>c;
store[i][0]=b;
store[i][1]=c;
a[b]++;//该数字出现的次数加1
a[c]++;
}
for(int i=1;i<=6;i++)
{
if(a[i]==2)
{
temp++;//找到出现两次,也就是与两个化学键相连的原子个数
}
}
if(temp==4)//判断
{
cout<<"n-hexane\n";
}
else if(temp==1)
{
cout<<"2,2-dimethylbutane\n";
}
else if(temp==0)
{
cout<<"2,3-dimethylbutane\n";
}
else
{//如果不属于以上三种
int hh;
int hh1;
int hh2;
for(int i=1;i<=6;i++)
{
if(a[i]==3) //找到与三个化学键相连的原子
{
hh=i;
break;
}
}
for(int i=1;i<=6;i++)
{
if(a[i]==2)//找到两与两个化学键相连的原子
{
hh1=i;
break;
}
}
for(int i=hh1+1;i<=6;i++)
{
if(a[i]==2)
{
hh2=i;
break;
}
}
int it=0;
for(int i=0;i<5;i++)//根据输入的内容进行判断
{
if(((store[i][0]==hh)&&(store[i][1]==hh1))||((store[i][0]==hh1)&&(store[i][1]==hh)))//有几条符合条件的化学键
{
it++;
}
if(((store[i][0]==hh)&&(store[i][1]==hh2))||((store[i][0]==hh2)&&(store[i][1]==hh)))
{
it++;
}
}
if(it==2)
{
cout<<"3-methylpentane\n";
}
else
{
cout<<"2-methylpentane\n";
}
}
temp=0;
}
}