Week2:区分己烷的同分异构体

A-化学

题目内容:
化学很神奇,以下是烷烃基。
己烷的五个同分异构体
假设如上图,这个烷烃基有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的点有4个。
  • 2,3-dimethylbutane:出边为3的点有2个。
  • 2,3-dimethylbutane:出边为4的点有1个。

至于2-methylpentane和3-methylpentane,他们都有1个出边为3的点,2个出边为1的点,和3个出边为1的点,显然不能像上面三个那样简单区分。
因此采取的策略是:

  1. 找出出边为3的那个点(因为出边为3的点只有一个)
  2. 遍历和这个点相连的三个点(出边为3嘛)
  3. 获取这三个点的出边之和

然后我们就会发现:

  • 2-methylpentane出边为3的点所相连的三个点的出边之和为5,另一个为4。

很好,找到了特点,于是我们可以写出以下代码:

#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>

using namespace std;

vector<int> Point[7];//6个碳原子

int key[6];//key[i]:有i个化学键的点的数量

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		memset(key, 0, sizeof key);
		for (int i = 1; i <= 6; i++)
		{
		    //归零操作
			Point[i].clear();
		}

		int a, b;
		for (int i = 0; i < 5; i++)
		{
			cin >> a >> b;
			Point[a].push_back(b);
			Point[b].push_back(a);
		}

		for (int i = 1; i <= 6; i++)
		{
			key[Point[i].size()]++;
		}

		if (key[2] == 4)
		{
			printf("n-hexane\n");
			continue;
		}
		if (key[4] == 1)
		{
			printf("2,2-dimethylbutane\n");
			continue;
		}
		if (key[3] == 2)
		{
			printf("2,3-dimethylbutane\n");
			continue;
		}
		for (int i = 1; i <= 6; i++)
		{
			if (Point[i].size() == 3)
			{
				int subkey = 0;
				for (int j = 0; j < Point[i].size(); j++)
				{
					subkey += Point[Point[i][j]].size();
				}

				if (subkey == 5)
				{
					printf("3-methylpentane\n");
				}
				else
				{
					printf("2-methylpentane\n");
				}

				break;
			}
		}

	}

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值