SDU--A - 化学 (编译器选 GNU G++)

题目描述

在这里插入图片描述

化学很神奇,以下是烷烃基。
假设如上图,这个烷烃基有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-methylpentane:一个碳原子三个化学键,两个碳原子两个化学键并且该两个碳原子相连
3-methylpentane:一个碳原子三个化学键,两个碳原子两个化学键并且该两个碳原子不相连
2,3-dimethylbutane:有两个碳原子有三个化学键
2,2-dimethylbutane:有一个碳原子有四个化学键

过程

step1:
接收输入,并且a数组表示某碳原子拥有化学键个数

for(j=1;j<6;j++){
		cin>>x[j]>>y[j];
		a[x[j]]++;
		a[y[j]]++;
	}

step2:
遍历a数组,记录六个碳原子中,拥有一个化学键的原子个数,拥有两个化学键的原子个数…

for(j=1;j<=6;j++){
			if(a[j]==1)n1++;
			if(a[j]==2)n2++;
			if(a[j]==3)n3++;
			if(a[j]==4)n4++;
		}

step3:
如下判断可以直接辨别三种化合物,否则进入第四步

if(n4==1) cout<<"2,2-dimethylbutane"<<endl;
		else if(n1==2 && n2==4) cout<<"n-hexane"<<endl;
		else if(n1==4 && n3==2) cout<<"2,3-dimethylbutane"<<endl;

step4:
其余两种物质可以如此区分:找到这个拥有三个化学键的原子,判断与其相连的三个原子拥有的化学键的总个数来区分
step4.1
找到该拥有三个化学键的原子

for(j=1;j<=6;j++){
	if(a[j]==3){
		goal = j;
		break;
	}	
}

step4.2
找到与该三化学键原子相连的另外三个原子,记录到数组m中

num=0;
for(j=1;j<=6;j++)
	if(x[j]==goal){
		m[num]=y[j];
		num++;
}
for(j=1;j<=6;j++)
	if(y[j]==goal){
		m[num]=x[j];
		num++;
}

step4.3
计算另外三个原子的所有化学键的总个数并且做出判断

扫描二维码关注公众号,回复: 10399859 查看本文章
			total = a[m[1]]+a[m[2]]+a[m[3]];
			 
			if(total==4)cout<<"2-methylpentane"<<endl;
			else cout<<"3-methylpentane"<<endl;

代码

#include <bits/stdc++.h>
using namespace std;
int main(){
	vector<int> a(7);
	int x[6],y[6];//接收输入数据 
	int t,n,m,j,i,k;
	int n1,n2,n3,n4;//用于记录化合物中化学键分别为1\2\3\4 的碳原子个数 
	cin>>t;
//	初始化 
	for(i=0;i<t;i++){
		n1=n2=n3=n4=0;
		for(k=0;k<=6;k++)
		a[k]=0;
//接收输入,并且a数组表示某碳原子拥有化学键个数
	for(j=1;j<6;j++){
		cin>>x[j]>>y[j];
		a[x[j]]++;
		a[y[j]]++;
	}	
//		遍历a数组,记录六个碳原子中,拥有一个化学键的原子个数,拥有两个化学键的原子个数......
		for(j=1;j<=6;j++){
			if(a[j]==1)n1++;
			if(a[j]==2)n2++;
			if(a[j]==3)n3++;
			if(a[j]==4)n4++;
		}
//如下判断可以直接辨别三种化合物,
		if(n4==1) cout<<"2,2-dimethylbutane"<<endl;
		else if(n1==2 && n2==4) cout<<"n-hexane"<<endl;
		else if(n1==4 && n3==2) cout<<"2,3-dimethylbutane"<<endl;
		else {
//			找到该拥有三个化学键的原子
			int m[4],goal,num;
			for(j=1;j<=6;j++){
				if(a[j]==3){
					goal = j;
					break;
				}	
			}
//			找到与该三化学键原子相连的另外三个原子,记录到数组m中
			num=1;
			for(j=1;j<=6;j++)
			if(x[j]==goal){
				m[num]=y[j];
				num++;
			}
			for(j=1;j<=6;j++)
			if(y[j]==goal){
				m[num]=x[j];
				num++;
			}
//			计算另外三个原子的所有化学键的总个数并且做出判断
			int total=0;
			total = a[m[1]]+a[m[2]]+a[m[3]];
			 
			if(total==4)cout<<"2-methylpentane"<<endl;
			else cout<<"3-methylpentane"<<endl;	
		}	
	}
}
发布了29 篇原创文章 · 获赞 14 · 访问量 1268

猜你喜欢

转载自blog.csdn.net/weixin_44552961/article/details/104644554