【A-化学】甄别六碳烷烃基类别

题意:【A-化学】甄别六碳烷烃基类别_第1张图片

如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6(原子没有固定编号方法)。用一对数字 a,b 表示原子a和原子b间有一个化学键。通过5行a,b可以描述一个烷烃基,甄别烷烃基的类别。

样例输入:
在这里插入图片描述
样例输出:
在这里插入图片描述

思路:

甄别不同烷烃基的关键在于找到五种烷烃基的区别。用一个方形矩阵表示两个碳之间是否有化学键,然后统计不同度数碳的个数。

“2,2-dimethylbutane”有1个4度碳,“2,3-dimethylbutane”有2个3度碳和4个1度碳,“n-hexane”有2个1度碳和4个2度碳。其余两种,若3度碳与其余两个2度碳相邻,则是“3-methylpentane”,否则就是“2-methylpentane”。

总结:

把碳抽象成点,把化学键抽象成连线,用二维数组存储。

这是一种比较暴力的方法,有很多的循环和判断,找五种烷烃基的不同。

代码:

#include
using namespace std;
int main()
{
	int n;
	cin >> n;
	int ab[7][7];
	int row[7];//记录每一个点的连线个数 
	int sum[5];//记录点的连线数为1 2 3 4的点的个数 
	for (int k = 0; k < n; k++)
	{
		for (int i = 0; i < 7; i++)//初始化任意两点之间没有线
			for (int j = 0; j < 7; j++)
				ab[i][j] = 0;
		for (int j = 1; j < 6; j++)
		{
			int a;
			int b;
			cin >> a;
			cin >> b;
			ab[a][b] = 1;//a,b之间连线
			ab[b][a] = 1;
		}
		for (int i = 1; i < 7; i++)//初始化row 
			row[i] = 0;
		for (int i = 1; i < 7; i++)
			for (int j = 1; j < 7; j++)
				if (ab[i][j] == 1)
					row[i]++;
		for (int i = 0; i < 5; i++)
			sum[i] = 0;
		for (int i = 1; i < 7; i++)
			sum[row[i]]++;
		if (sum[4] == 1)//只有一种烷烃基有一个点的连线数是4
			cout << "2,2-dimethylbutane" << endl;
		else if (sum[3] == 2 && sum[1] == 4)
			cout << "2,3-dimethylbutane" << endl;
		else if (sum[1] == 2 && sum[2] == 4)
			cout << "n-hexane" << endl;
		else
		{
			int hav3;
			int hav2_1, hav2_2;
			bool hav2 = false;
			for (int i = 0; i < 7; i++)
			{
				if (row[i] == 3)
					hav3 = i;
				else if (row[i] == 2 && hav2 == false)
				{
					hav2_1 = i;
					hav2 = true;
				}
				else if (row[i] == 2)
					hav2_2 = i;
			}
			if (ab[hav3][hav2_1] == 1 && ab[hav3][hav2_2] == 1)
				cout << "3-methylpentane" << endl;
			else
				cout << "2-methylpentane" << endl;
		}
	}	
}

你可能感兴趣的:(c++)