当前位置: 代码迷 >> 综合 >> 【程序设计思维与实践 week2 实验题】化学
  详细解决方案

【程序设计思维与实践 week2 实验题】化学

热度:18   发布时间:2024-01-27 05:52:28.0

题目描述

化学很神奇,以下是烷烃基。
在这里插入图片描述假设如上图,这个烷烃基有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
是同一种,本质上就是一条链,编号其实是没有关系的,可以在纸上画画就懂了。

Input

输入第一行为数据的组数T(1≤T≤200000)。每组数据有5行,每行是两个整数a, b(1≤a,b≤6,a ≤b)

数据保证,输入的烷烃基是以上5种之一

Output

每组数据,输出一行,代表烷烃基的英文名

Example

Input
2
1 2
2 3
3 4
4 5
5 6
1 4
2 3
3 4
4 5
5 6
Output
n-hexane
3-methylpentane

思路

求每一个点的度数,然后统计每种度数的数量(一共1、2、3、4四种),根据是否存在点度4判断2,2-dimethylbutane,根据点度3数量是否为2判断2,3-dimethylbutane,根据点度3是否存在判断n-hexane,剩下两种,求点度为3的点相邻点中点度为1的数目,若是2则是2-methylpentane,否则为3-methylpentane。

总结

看了看助教的代码,方法是求的每一个点和它的相邻点的度数关系的数目,用二维数组存储,这不失为一种好的方法。而且代码十分简洁,值得学习,可以稍微平衡一下本人的老年手速。。。

代码

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
using namespace std;
int main(){
// freopen("1.txt","r",stdin);int T;int d[7];int num[5];int e[7][7];cin >> T;while(T--){int x,y;int sum = 0;memset(d,0,sizeof(d));memset(num,0,sizeof(num));memset(e,0,sizeof(e));for(int i=1; i<=5; i++){cin >> x >> y;e[x][y] = 1;e[y][x]	= 1;d[x]++;d[y]++;}for(int i=1; i<=6; i++){num[d[i]]++;}if(num[4]) {cout << "2,2-dimethylbutane" <<endl;continue;}if(num[3] == 2){cout << "2,3-dimethylbutane" <<endl;continue;}if(num[3] == 0){cout << "n-hexane" <<endl;continue;}int ans = 0;for(int u=1; u<=6; u++)if(d[u] == 3){for(int v=1; v<=6; v++)if(e[u][v] && d[v]==1)ans++;break;}if(ans == 2)cout << "2-methylpentane" <<endl;else cout << "3-methylpentane" <<endl;} return 0;}
  相关解决方案