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
是同一种,本质上就是一条链,编号其实是没有关系的,可以在纸上画画就懂了
-
解题思路:初始化一个二维数组,原子由编号构成,将中间有化学键的两个原子对应的坐标值置1。例如编号为5.6的原子间存在化学键,则将二维数组中(5,6)和(6,5)的值改为1。将每个原子所连的化学键的数目统计下来进行排序,与图中烷烃基进行比较。2和3是同分异构体,可以在二维数组中找到所连化学键为1的原子,再统计其所连原子的化学键数目。会发现2的结构为两个所连化学键为1的原子连接着一个所连化学键为3的原子,而3的结构为2个所连化学键为1的原子连接着两个化学键为2的原子,以此来区分2和3。
-
代码实现:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
int a,b;
cin>>n;
for(int m=0;m<n;m++)
{
int s[6][6];
for(int i=0;i<6;i++)//初始化
{
for(int j=0;j<6;j++)
{
s[i][j]=0;
}
}
for(int j=0;j<5;j++)//输入
{
cin>>a>>b;
s[a-1][b-1]=1;
s[b-1][a-1]=1;
}
int x[6];
for(int i=0;i<6;i++)
{
x[i]=0;
}
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
if(s[i][j]==1)
x[i]++;
}
}
sort(x,x+6);//排序
/*for(int i=0;i<6;i++)
{
cout<<x[i]<<" ";
}*/
int aa[6]={1,1,2,2,2,2};
bool equal1=true;
for (int i=0;i<6;i++)
{
if (x[i] != aa[i])
{
equal1=false;
break;
}
}
if(equal1)
{
cout<<"n-hexane"<<endl;
continue;
}
int bb[6]={1,1,1,2,2,3};
bool equal2=true;
for (int i=0;i<6;i++)
{
if (x[i] != bb[i])
{
equal2=false;
break;
}
}
int z;
if(equal2)
{
int count2=0;
for(int i=0;i<6;i++)
{
int count=0,count1=0;
for(int j=0;j<6;j++)
{
if(s[i][j]==1)
{
count++;
z=j;
}
// cout<<z<<"zzzzz"<<count<<endl;
}
if (count==1)
{
for(int j=0;j<6;j++)
{
if(s[z][j]==1) count1++;
}
// cout<<count1<<"11111";
}
if(count1==2)
{
count2++;
// cout<<count2<<"22222"<<endl;
continue;
}
}
if(count2==2)
{
cout<<"3-methylpentane"<<endl;
continue;
}
if(count2==1)
{
cout<<"2-methylpentane"<<endl;
continue;
}
}
int dd[6]={1,1,1,1,3,3};
bool equal4=true;
for (int i=0;i<6;i++)
{
if (x[i] != dd[i])
{
equal4=false;
break;
}
}
if(equal4)
{
cout<<"2,3-dimethylbutane"<<endl;
continue;
}
int ee[6]={1,1,1,1,2,4};
bool equal5=true;
for (int i=0;i<6;i++)
{
if (x[i] != ee[i])
{
equal5=false;
break;
}
}
if(equal5)
{
cout<<"2,2-dimethylbutane"<<endl;
continue;
}
}
}