题意:
对于给出的五个数字序列,通过算法来判断该六个数字连起来的分别是对应的哪条链(注意数字的顺序并不对结果产生影响,只是判断所成的形状)。
思路:
首先看到这个题,因为是训练题的原因,想着针对这个题的特征来解题,即从每个原子的所有的化学键多少来判断,很容易看到同分异构的原子的化学键的数量并不同,通过每个原子的这个特征判断出。但在其中有3-和2-的特征是一样的,因此对其判断不出来,再对这两个进行特征的判断。可发现3-的原子所连接的三个原子的化学键的数量分别是2,2,1;2-的特征是1,1,2。可通过用矩阵存图,然后在图中找到所邻接的原子的化学键的个数来判断出这两个。
总结:
第一次遇到这个题目,刚看到的时候还是有点慌的,自己写的这个代码感觉也是乱乱的,完全是对着题目来解的。就主要是提取出每个图中的特征,再判断就好了。
代码:
#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int n;
cin>>n;
int a, b;
for(int i=0; i<n; i++){
int M[7][7]={0}; //记录图的矩阵
int count1[7]={0}; //记录每个原子的化学键的多少
int count2[7]={0};
for(int j=0; j<5; j++){ //读取,记录化学键的数量
cin>>a>>b;
M[a][b]=1;
M[b][a]=1;
count1[a]++;
count1[b]++;
count2[a]++;
count2[b]++;
}
sort(count1,count1+7); //对化学键的数量进行排序
if(count1[6]==4){
cout<<"2,2-dimethylbutane"<<endl;
}else if(count1[6]==3 && count1[5]==3){
cout<<"2,3-dimethylbutane"<<endl;
}else if(count1[6]==2){
cout<<"n-hexane"<<endl;
}else{ //通过对这两个原子邻接的原子的化学键数进行判断
int i=1;
for(; i<=6;i++){
if(count2[i]==3)
break;
}
int ret=0;
for(int k=1;k<=6;k++){
if(M[i][k]==1){
if(count2[k]==2)
ret++;
}
}
if(ret==1){
cout<<"2-methylpentane"<<endl;
}else{
cout<<"3-methylpentane"<<endl;
}
}
}
return 0;
}