Week2 A - 化学
程序员文章站
2022-07-12 14:58:54
...
模拟题
给你六个节点的一棵树让你求是下图中哪种,输出名字。
暴力枚举就完事了
找到每个图特殊的地方即可。
思路很简单,只需要记录每个节点的度数和它的邻接点。
从度数入手
- 四度节点
我们发现有四度节点的只有这个
- 三度节点
有三度节点的有三个图,但是这三个邻接点的情况各不相同。判断的方法有很多,我用的是邻接点度数的乘积。
①乘积:1 x 1 x 2 = 2
②乘积:2 x 2 x 1 = 4
③乘积:3 x 1 x 1 = 3
- 两度节点
只剩最后一个了。else就好了
#include<iostream>
#include<cstring>
#define For(i,a,n) for(register int i=a;i<=n;i++)
using namespace std;
int T,a,b;
struct node{
int ds; //度数
int num_of_nb; //这里zz了 这东西和度数应该是一样的
int nb[10]; //neighbors
}A[10];
int main(){
ios::sync_with_stdio(false);
cin>>T;
while(T--){
int flag = 0; //判断是否有输出
memset(A,0,sizeof(A));
For(i,1,5){
cin>>a>>b;
A[a].ds++, A[b].ds++; //a和b节点ds++
A[a].nb[++A[a].num_of_nb]=b; //相互成为邻居
A[b].nb[++A[b].num_of_nb]=a;
}
For(i,1,6){
if(A[i].ds==4){ //度数为4
cout<<"2,2-dimethylbutane"<<endl;
flag = 1;
break;
}
if(A[i].ds==3){ //度数为3
int temp=1; //记录邻接点度数乘积
For(j,1,3){
int nb = A[i].nb[j];
int nbds = A[nb].ds;
temp*=nbds;
}
if(temp==2) //乘积为2
cout<<"2-methylpentane"<<endl;
else if(temp==3) //乘积为3
cout<<"2,3-dimethylbutane"<<endl;
else if(temp==4) //乘积为4
cout<<"3-methylpentane"<<endl;
flag=1;
break;
}
}
if(!flag) cout<<"n-hexane"<<endl;
}
return 0;
}
上一篇: Revit二开--判断元素是否被标记过
下一篇: Week2 作业&实验