題目描述
化學很神奇,以下是烷烴基。
假設如上圖,這個烷烴基有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;
}
}
}