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
計算另外三個原子的所有化學鍵的總個數並且做出判斷

			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;	
		}	
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章