算法-程序设计课week2---A:Gym-270437A

化学很神奇,以下是烷烃基。在这里插入图片描述
假设如上图,这个烷烃基有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种之一

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
//
//该题要把握图中化学式的特点,五个化学式中有三个可以通过单原子形成的最大化学键数而确定
//剩余两个可以通过分析与最大化学键数原子相连接的三个原子的化学键数目确定。
#include<cstdio>
using namespace std;

void printType(int *m,int* ma) {
	int tri=0;
	int pos=0;
	//获取最大连通值
	for(int i=1; i<=6; i++) {
		if(m[i]==4) {
			printf("2,2-dimethylbutane");
			return;
		}

		if(m[i]==3) {
			++tri;
			pos=i;
		}
	}

	if(tri==0) {
		printf("n-hexane");
		return;
	} else if(tri==1) {//剩下两种通过进一步分析来区分。
		int num=0;
		for(int i=1; i<7; i++) {
			if(ma[pos*7+i]==1) {
				if(m[i]==1)++num;
			}
		}
		if(num==2) {
			printf("2-methylpentane");
		} else {
			printf("3-methylpentane");
		}
		return ;
	} else if(tri==2) {
		printf("2,3-dimethylbutane");
		return;
	}
}
int main() {
	//freopen("input.txt","r",stdin);
	int num;
	scanf("%d",&num);
	while(num--) {
		int m[7]= {0};
		int ma[7][7]= {0};
		//对每个样例都构建两个数组
		for(int i=0; i<5; i++) {
			int a,b;
			scanf("%d %d",&a,&b);
			//printf("%d %d\n",a,b);
			m[a]++;
			m[b]++;
			ma[a][b]=1;
			ma[b][a]=1;
		}
		printType(m,&ma[0][0]);
		printf("\n");
	}
}

strcmp

返回值 < 0,则表示 str1 < str2。
返回值 > 0,则表示 str2 > str1。
返回值 == 0,则表示 str1 == str2。

发布了166 篇原创文章 · 获赞 21 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/lgfx21/article/details/104575308