简单模拟_烷烃基种类判断问题

题意:
烷烃基有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种之一。
5种烷烃基
输出:
每组数据,输出一行,代表烷烃基的英文名
输入样例:
1 2
2 3
3 4
4 5
5 6
1 4
2 3
3 4
4 5
5 6
输出样例:
n-hexane
3-methylpentane
解题思路:
这道题并不困难,感觉会有很多不同的办法,我观察了每一种烷烃基的特点,发现不同烷烃基的每个碳原子的邻位碳个数不同,有三种烷烃基具有两个邻位碳的碳原子分别是4个,1个,0个,还有两种烷烃基具有两个邻位碳的碳原子个数为2,因此只需要能分辨这两种烷烃基即可。进一步发现,一种烷烃基具有3个邻位碳的碳原子的相邻的碳原子中具有2个邻位碳的碳原子的个数为2,另一个烷烃基为1(这段话有点绕口,理解为度就行了)。通过这个不同即可区分剩下两种烷烃基。由于需要区分剩下这两种烷烃基的情况应该不多,所有程序运行的时间效率应该还不错。
注意事项:
1、我们使用一维数组 int a[7]来分别记录1-6号原子的度。
2、我们使用二位动态数组vector b[7]来记录具有3个邻位碳的碳原子的相邻的碳原子,在需要区分剩下这两种烷烃基的情况下,我们对具有3个邻位碳的碳原子的相邻的碳原子进行遍历,通过度为2的原子的个数不同(一个为1,一个为2)来区分它们,在其他情况下则不需要使用b数组。另外注意英文名称要输入正确,听说很多同学都这里出错了。
参考代码:

#include <bits/stdc++.h>
using namespace std;
int main(int argc, const char * argv[]) {
    int t;cin>>t;
    while (t--) {
        int x,y;
        int a[7];
        for (int j=1; j<=6; j++) {
            a[j]=0;
        }
        vector<int> b[7];
        for (int j=0; j<5; j++) {
            cin>>x>>y;
            a[x]++;a[y]++;
            b[x].push_back(y);
            b[y].push_back(x);
        }
    int count=0;
    int a3=0;
    for (int i=1; i<=6; i++) {
        if(a[i]==2)count++;
        if(a[i]==3)a3=i;
    }
    if(count==0)cout<<"2,3-dimethylbutane"<<endl;
    if(count==1)cout<<"2,2-dimethylbutane"<<endl;
    if(count==4)cout<<"n-hexane"<<endl;
    if (count==2) {
        int count2=0;
        for (int k=0; k<b[a3].size(); k++) {
            int z=b[a3][k];
            if(a[z]==2)count2++;
        }
        if(count2==2){cout<<"3-methylpentane"<<endl;}
        else {
            cout<<"2-methylpentane"<<endl;}
    }
    }
    return 0;
}
发布了5 篇原创文章 · 获赞 5 · 访问量 159

猜你喜欢

转载自blog.csdn.net/weixin_43637016/article/details/104566061