题目
答案
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int a[101],fa[101];//数组a储存临时父辈,fa储存实际父辈,后面会涉及
map<string,int> maps;
vector<int> vec[101];//定义vector容器的数组
bool dfs(int a,int b)//广度优先搜索后辈
{
if(vec[a].size()==0) return false;
else
{
for(size_t i=0;i<vec[a].size();i++)// vec[a].size()返回的是size_t类型,当然int i也是可以的
{
if(vec[a][i]==b) return true;
if(dfs(vec[a][i],b)) return true;
}
return false;
}
}
bool solve(string tmp1,string tmp2,char ch)
{
int a=maps[tmp1],b=maps[tmp2];
switch(ch)
{
case 'p':return fa[b]==a;break;
case 'c':return fa[a]==b;break;
case 's':return fa[a]==fa[b];break;
case 'a':return dfs(a,b);break;
case 'd':return dfs(b,a);break;
}
}
int main()
{
int n1,n2,cnt=0;
cin>>n1>>n2;
getchar();//这行代码一定不要忘!!!否则所有节点报错
while(n1--)
{
string name="",s="";
getline(cin,s);
int k=0;//k表示空格数
for(int i=0;i<s.size();i++)
{
if(s[i]==' ') k++;
else name+=s[i];
}
k/=2;
maps[name]=cnt++;
int id=maps[name];
if(k)
{
fa[id]=a[k];
vec[a[k]].push_back(id);
}
else fa[id]=-1;
a[k+1]=id;
//更新临时父辈,数组a的意思就是如果后面有k+1的子辈,那么他的父辈就该是当前的id
//因为有如果的存在,所以数组a是临时的父辈,而fa储存的就是实际的父辈了
}
while(n2--)
{
string s1,s2,s3,tmp;
cin>>s1>>tmp>>tmp>>s2>>tmp>>s3;
if(solve(s1,s3,s2[0])) cout<<"True"<<endl;
else cout<<"False"<<endl;
}
}
总结
-
这道题常规处理,使用string相关函数当然也是可以做的,如果大家想了解相关的代码,我推荐这篇文章——家谱处理。当然本人更喜欢使用c++的容器,因为真的好用
-
关于代码的解释我都放在注释中了,大家可以自行查看
-
另外,如果大家对于vector容器的含义以及相关操作不太熟悉, 可以到这篇文章一探究竟——C++_vector操作
-
如果对于代码部分仍有疑问,可以将其发在评论区中,我会尽我所能予以回复。