思路:寫的dfs搜索,感受還行,具體能夠看註釋......php
1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<cmath>
5 #include<algorithm>
6 #include<map>
7 #include<set>
8 #include<vector>
9 #include<queue>
10 using namespace std; 11 #define ll long long
12
13 const int maxn=105;//A->Z : 65->90
14
15 int e[maxn][2]; 16 int book[maxn]; 17
18 int countt; 19
20 void dfs(int zi,int step,int endd) 21 { 22 if(countt!=-1)//已經找到,直接return
23 return ; 24
25 if(zi==endd)//找到了
26 { 27 countt=step; 28 return ; 29 } 30
31 for(int i=0;i<2;i++)//兩個方向搜索
32 { 33 if(e[zi][i]!=0&&book[e[zi][i]]==0) 34 { 35 book[e[zi][i]]=1; 36 dfs(e[zi][i],step+1,endd); 37 book[e[zi][i]]=0; 38 } 39 } 40 return ; 41 } 42
43 int main() 44 { 45 ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 46
47 int n,m; 48 while(cin>>n>>m&&(n||m)) 49 { 50 memset(e,0,sizeof(e)); 51
52 string str; 53
54 int zi,fu,mu; 55
56 for(int i=0;i<n;i++) 57 { 58 cin>>str; 59
60 zi=str[0]; fu=str[1]; mu=str[2]; 61
62 if(str[1]!='-')//排除
63 e[zi][0]=fu; 64 if(str[2]!='-')//排除
65 e[zi][1]=mu; 66
67 } 68
69 int a,b; 70
71 for(int i=0;i<m;i++) 72 { 73 cin>>str; 74 a=str[0]; b=str[1]; 75
76 if(a==b)//這題沒有這個特例,不用特判也能過
77 { 78 cout<<"-"<<endl; 79 continue; 80 } 81
82 countt=-1; 83
84 memset(book,0,sizeof(book)); 85 book[a]=1; 86
87 int flag=0; 88
89 dfs(a,0,b);//從a向上找,有沒有b
90
91 if(countt==-1)//沒找到
92 { 93 flag=1;//刷新flag
94
95 memset(book,0,sizeof(book));//從新初始化再找
96 book[b]=1; 97 dfs(b,0,a);//從b向上找,有沒有a
98 } 99
100 if(countt==-1)//找兩次都沒找到
101 cout<<"-"<<endl;//顯然兩我的不要緊
102 else
103 { 104 if(flag==1)//第二次從b找到了a, a是b的長輩
105 { 106 if(countt==1)//格式輸出
107 cout<<"parent"<<endl; 108 else if(countt==2) 109 cout<<"grandparent"<<endl; 110 else if(countt==3) 111 cout<<"great-grandparent"<<endl; 112 else
113 { 114 for(int i=0;i<countt-3;i++) 115 cout<<"great-"; 116 cout<<"great-grandparent"<<endl; 117 } 118 } 119 else if(flag==0)//第一次從a找到了b, a是b的晚輩
120 { 121 if(countt==1) 122 cout<<"child"<<endl; 123 else if(countt==2) 124 cout<<"grandchild"<<endl; 125 else if(countt==3) 126 cout<<"great-grandchild"<<endl; 127 else
128 { 129 for(int i=0;i<countt-3;i++) 130 cout<<"great-"; 131 cout<<"great-grandchild"<<endl; 132 } 133 } 134 } 135 } 136 } 137
138 return 0; 139 }