题目
甄别烷烃基的类别。
假设如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基。
输入第一行为数据的组数T(1≤T≤200000)。每组数据有5行,每行是两个整数a, b(1≤a,b≤6,a ≤b)。数据保证,输入的烷烃基是以上5种之一 。
每组数据,输出一行,代表烷烃基的英文名。
解题思路
对上图的分子结构进行分析,我们可以统计每个原子化学键个数来识别出部分分子。其中,n-hexane 与2个化学键相连的原子个数为4,与1个化学键相连的原子个数为2。2,2-dimethylbutane 与4个化学键相连的原子个数为1,与2个化学键相连的原子个数为1,与1个化学键相连的原子个数为4。2,3-dimethylbutane 与3个化学键相连的原子个数为2,与1个化学键相连的原子个数为4。而 3-methylpentane 和 2-methylpentane 的参数相同,不能区分开,需要进一步的判断。
要区分 3-methylpentane 和 2-methylpentane ,可以找出与3个化学键相连的原子的三个相邻原子的化学键连接个数是为 2 2 1 还是 2 1 1 ,前者为 3-methylpentane 的特性,后者为 2-methylpentane 的特性。
程序代码
#include <iostream>
using namespace std;
int n, a, b;
int main()
{
cin >> n;
for (int o = 0; o < n; o++) {
int L[10] = { 0 };
int D[20] = { 0 };
for (int j = 0; j < 5; j++) {
cin >> a >> b;
L[a]++;
L[b]++;
D[2 * j] = a; D[2 * j + 1] = b;
}
int T[10] = { 0 };
for (int i = 1; i < 7; i++) {
T[L[i]]++;
}
if (T[4] == 1) {
cout << "2,2-dimethylbutane\n";
}
else if (T[3] == 2) {
cout << "2,3-dimethylbutane\n";
}
else if (T[2] == 4) {
cout << "n-hexane\n";
}
else {
int p = 0;
for (int j = 1; j < 7; j++) if (L[j] == 3) p = j;
int C[5];
int q1 = 0;
for (int i = 0; i < 10; i+=2) {
if (D[i] == p) C[q1++] = D[i + 1];
}
for (int i = 1; i < 10; i += 2) {
if (D[i] == p) C[q1++] = D[i - 1];
}
int q2=0;
for (int i = 0; i < 3; i++) {
if (L[C[i]] == 1) q2++;
}
if (q2 == 1) cout << "3-methylpentane\n";
if (q2 == 2) cout << "2-methylpentane\n";
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)