题目要求:
解题思路:
刚开始我以为这道题很简单,只需要更具层次就可以找到领导关系,后来才意识到一个层次可能有多个人。
所以一定要找到它的直接领导,而直接领导又是离自己最近的上一层的一个人,所以可以根据这个思路来找到领导,
实际上有点取巧的性质,但是学以致用,能用方为王道,嘻嘻~~~
代码如下:
#include<iostream>
#include<string>
using namespace std;
struct Node{
string name;
int parent;//根节点 -1
int level; //结点的级别 根节点 -1
};
//按照规律找最近的父节点
int search_parent(Node nodes[100],int level,int num){
for(int i=num-1;i>=0;i--){
if(nodes[i].level==level-1){
return i;
}
}
return 0;
}
int main(){
string str;
string name;
Node nodes[100];
cout<<"输入字符串:"<<endl;
cin>>str;
cout<<"输入名称:"<<endl;
cin>>name;
string s;
int p=0;//级别
int num = 0;
for(int i=0;i<str.length();i++){
if(str[i]!='('&&str[i]!=')'&&str[i]!=','){
s="";
while(str[i]>='a'&&str[i]<='z') s+=str[i++];
i--;
Node node;
node.name=s;
node.level = p;
if(p==1){
node.parent=-1;
}else{
node.parent = search_parent(nodes,p,num);
}
nodes[num]=node;
num++;
}else{
if(str[i]=='('){
p++;
}
if(str[i]==')'){
p--;
}
if(str[i]==','){
}
}
}
for(i=0;i<num;i++){
cout<<i<<" "<<nodes[i].name<<" "<<nodes[i].level<<" "<<nodes[i].parent<<endl;
}
string rstr=name;
int rnum=0;
for(i=0;i<num;i++){
if(name==nodes[i].name){
rnum=nodes[i].parent;
}
}
while(nodes[rnum].parent!=-1){
if(nodes[rnum].name!=name){
rstr = nodes[rnum].name+"<-"+rstr;
}
rnum = nodes[rnum].parent;
}
rstr = nodes[rnum].name+"<-"+rstr;
cout<<rstr<<endl;
return 0;
}