题目描述
如上图,,这个烷烃基有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
每组数据,输出一行,代表烷烃基的英文名
Example
Input
2
1 2
2 3
3 4
4 5
5 6
1 4
2 3
3 4
4 5
5 6
Output
n-hexane
3-methylpentane
解题思路
想要区分不同的同分异构体,就要找到每一个异构体的独特之处。
由于弱鸡是弱鸡,只能采用最简单原始的方法解决问题。仔细观察上图,首先将其看成五个图(但凡了解图的人应该都能做出如此判断),然后可发现几个同分异构体之间的不同点:
- 五个图之间的点的度数不同。比如第一个图只有度为1和2的点,而其他的图均有度大于2的点。这便是针对这道题的一个不同点。
- 2-methylpentane和3-methylpentane两个图虽然度完全相同,但度为3的点所在位置不同,前者度为3的点所连接的点的度为1和2,而后者度为3的点所连接的两个点的度均为2。
到这里,本题已经解决了一半,剩下的便是将上述思路“翻译”成C++语言即可。为了方便“翻译”,可以先选择保存值所需要的变量和结构。
首先是输入值的处理,同时为了方便图的描述,选择用大小为5的结构体数组pic[5]来保存“化学键”。结构体中只包含两个int型的变量;除此之外,由于需要计算每个点的度数,因此还需要用一个int型数组deg[7](7是根据输入值决定的)来表示;同时,为了区别某些图,还要用数组sum[5]来表示每一种度数的顶点个数。
代码
ok,接下来可以直接上代码(希望不要被嫌弃!!!!!)
#include<iostream>
using namespace std;
struct node//表示化学键
{
int a;
int b;
};
int main()
{
node pic[5];//保存输入的5个化学键
int deg[7];//用来保存每一个点的度
int sum[5];//用来保存每一种度数的顶点个数
int third;//用来专门记录度为3的顶点(这里可先忽略)
int n;
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<7;j++)
deg[j]=0;
for(int j=0;j<5;j++)
{
cin>>pic[j].a>>pic[j].b;
deg[pic[j].a]++;//将对应的点的度+1
deg[pic[j].b]++;
}
for(int j=0;j<5;j++)
sum[j]=0;
for(int j=1;j<7;j++)
{
sum[deg[j]]++;
if(deg[j]==3) third=j;//找到度为3的顶点
}
if(sum[2]==4)cout<<"n-hexane"<<endl;
if(sum[4]==1)cout<<"2,2-dimethylbutane"<<endl;
if(sum[3]==2)cout<<"2,3-dimethylbutane"<<endl;
if(sum[2]==2)//为了区分剩下的两个同分异构体,需要利用度为3的店和这个点连接的点的度数之和
{
int bb=0;//用来记录度为3的点连接的点的度数之和
for(int j=0;j<5;j++)
{
if(pic[j].a==third)
bb+=deg[pic[j].b];
else if(pic[j].b==third)
bb+=deg[pic[j].a];
}
if(bb==5)cout<<"3-methylpentane"<<endl;
if(bb==4)cout<<"2-methylpentane"<<endl;
}
}
return 0;
}
反省与感想
解题方法并不好,没有做到“泛型程序设计”的目标,只是针对特定的某些同分异构体有帮助(由于实在太弱,想不到更好的方法)。更没有什么算法和程序思维的使用。各位见谅!
写在最后
作为一名程序员小白,想努力写好代码,但脑子过于迟钝,唉。。。。。没办法
不过既然选择了要学这门专业,就算再苦再难再累,也得夜以继日的敲代码(老师逼得狠,身边的大佬逼得更狠)
希望所有程序员,不管是小白还是大佬,都可以越肝越勇,少掉几根头发!!!