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

题意

假设如下图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基 .输入多组数据,判断是下面哪种烷烃基.
在这里插入图片描述

思路

  • 通过对五种烷烃基的分析,发现每一个烷烃基中原子的化学键的个数差异可以唯一确定3个烷烃基,n-hexane(存在原子拥有的最多化学键为2个),2-3-dimethybutane(其中有两个原子的化学键个数最为3个),2-2-dimethybutane(存在原子拥有的最多化学键的个数为4个)
  • 对于2-methylpentane和3-methylpentane,两个原子化学键的个数差异不能区别这两个烷烃基,通过图示分析,3-methylpentane存在一个三键原子和两个二键原子相连,而2-methylpentane不存在这样的规律,通过这个就可以区别这两个烷烃基,对比于其他三个烷烃基,这两个烷烃基只存在一个原子的化学键最多为3个,可以区分.
  • 根据输入的格式,五行a,b.可以选择将其存储在一个二维数组,为一个图.在输入的过程中,将每一个烷烃基的每一个原子所拥有的化学键个数计算出来,存入一维数组,进行升序排序,判断原子最多化学键的个数,可以直接确定前三个烷烃基,也将后面两个烷烃基分开,然后进行相邻判断,由于3-methylpentane的三键原子和两个二键原子相连,进而判断出这两个.

总结

这道题主要是需要仔细观察这五幅图中的烷烃基,找出区别这五种烷烃基的关键之处,主要难点就是如何区分2-methylpentane和3-methylpentane这两个烷烃基,这两个非常相似,给予迷惑性.
数据的输入直接使用二维数组,将存在化学键表示为 1,不存在为0 ,可以说是设置障碍,为以后的遍历提供便利.

代码

#include<iostream>
#include<queue>
#include<algorithm>
struct C_number {
	int x;
	int y;
	bool operator<(const C_number &	C) {
		return x<C.x;
	}
};
using namespace  std;
class graph {
	private:
		int **b;
		struct C_number  *c1;
	public:
		graph() {
			b=new int*[7];
			for(int i=1; i<=6; i++)
				b[i]=new int[7];
			for(int i=1; i<=6; i++) {
				for(int j=1; j<=6; j++) {
					b[i][j]=0;
				}
			}
			c1=new struct C_number[7];
			for(int i=1; i<7; i++)
				c1[i].x=0,c1[i].y=i;
		}
		void intput() {
			int n,m,temp=0;
			while(temp!=5&&cin>>n>>m) {
				for(int i=1; i<=6; i++) {
					for(int j=1; j<=6; j++) {
						if(n==i&&m==j)
							b[i][j]=1,b[j][i]=1,c1[i].x++,
							c1[j].x++;
					}

				}
				temp++;
			}
		}
		void  judge() {
			sort(c1+1,c1+7);
	        //for(int i=1;i<=6;i++)
	         	//cout<<c1[i].y<<" "<<c1[i].x;
	        //cout<<endl;
			if(c1[6].x==3&&c1[5].x==2) {
				int p=c1[6].y;
				int q=c1[5].y;
				int q1=c1[4].y;
				if(b[p][q]==1&&b[p][q1]==1)
					cout<<"3-methylpentane"<<endl;
				else
					cout<<"2-methylpentane"<<endl;
				return;
			}
			if(c1[6].x==2) {	
				cout<<"n-hexane"<<endl;
				return;
			}
			if(c1[6].x==4) {
				cout<<"2,2-dimethylbutane"<<endl;
				return;
			}
			if(c1[6].x==3&&c1[5].x==3) {
				cout<<"2,3-dimethylbutane"<<endl;
				return;
			}
		}
};
int main() {
	int n;
	cin>>n;
	
	for(int i=0; i<n; i++) {
		graph a;
		a.intput();
		a.judge();
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值