如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6(原子没有固定编号方法)。用一对数字 a,b 表示原子a和原子b间有一个化学键。通过5行a,b可以描述一个烷烃基,甄别烷烃基的类别。
样例输入:
样例输出:
甄别不同烷烃基的关键在于找到五种烷烃基的区别。用一个方形矩阵表示两个碳之间是否有化学键,然后统计不同度数碳的个数。
“2,2-dimethylbutane”有1个4度碳,“2,3-dimethylbutane”有2个3度碳和4个1度碳,“n-hexane”有2个1度碳和4个2度碳。其余两种,若3度碳与其余两个2度碳相邻,则是“3-methylpentane”,否则就是“2-methylpentane”。
总结:把碳抽象成点,把化学键抽象成连线,用二维数组存储。
这是一种比较暴力的方法,有很多的循环和判断,找五种烷烃基的不同。
代码:#include
using namespace std;
int main()
{
int n;
cin >> n;
int ab[7][7];
int row[7];//记录每一个点的连线个数
int sum[5];//记录点的连线数为1 2 3 4的点的个数
for (int k = 0; k < n; k++)
{
for (int i = 0; i < 7; i++)//初始化任意两点之间没有线
for (int j = 0; j < 7; j++)
ab[i][j] = 0;
for (int j = 1; j > a;
cin >> b;
ab[a][b] = 1;//a,b之间连线
ab[b][a] = 1;
}
for (int i = 1; i < 7; i++)//初始化row
row[i] = 0;
for (int i = 1; i < 7; i++)
for (int j = 1; j < 7; j++)
if (ab[i][j] == 1)
row[i]++;
for (int i = 0; i < 5; i++)
sum[i] = 0;
for (int i = 1; i < 7; i++)
sum[row[i]]++;
if (sum[4] == 1)//只有一种烷烃基有一个点的连线数是4
cout << "2,2-dimethylbutane" << endl;
else if (sum[3] == 2 && sum[1] == 4)
cout << "2,3-dimethylbutane" << endl;
else if (sum[1] == 2 && sum[2] == 4)
cout << "n-hexane" << endl;
else
{
int hav3;
int hav2_1, hav2_2;
bool hav2 = false;
for (int i = 0; i < 7; i++)
{
if (row[i] == 3)
hav3 = i;
else if (row[i] == 2 && hav2 == false)
{
hav2_1 = i;
hav2 = true;
}
else if (row[i] == 2)
hav2_2 = i;
}
if (ab[hav3][hav2_1] == 1 && ab[hav3][hav2_2] == 1)
cout << "3-methylpentane" << endl;
else
cout << "2-methylpentane" << endl;
}
}
}