hdu 3786 找出直系親屬 (dfs)

Problem Description
若是A,B是C的父母親,則A,B是C的parent,C是A,B的child,若是A,B是C的(外)祖父,祖母,則A,B是C的grandparent,C是A,B的grandchild,若是A,B是C的(外)曾祖父,曾祖母,則A,B是C的great-grandparent,C是A,B的great-grandchild,以後再多一輩,則在關係上加一個great-。
 
Input
輸入包含多組測試用例,每組用例首先包含2個整數n(0<=n<=26)和m(0<m<50), 分別表示有n個親屬關係和m個問題, 而後接下來是n行的形式如ABC的字符串,表示A的父母親分別是B和C,若是A的父母親信息不全,則用-代替,例如A-C,再而後是m行形式如FA的字符串,表示詢問F和A的關係。
當n和m爲0時結束輸入。
 
Output
若是詢問的2我的是直系親屬,請按題目描述輸出2者的關係,若是沒有直系關係,請輸出-。
具體含義和輸出格式參見樣例.
 
Sample Input
 
3 2
ABC
CDE
EFG
FA
BE
0 0
 
Sample Output
 
great-grandparent
-

 

思路:寫的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 }
相關文章
相關標籤/搜索