HDU 3786 找出直系亲属 dfs搜索

来源:互联网 发布:网络发射器和接收器 编辑:程序博客网 时间:2024/06/06 11:44

找出直系亲属

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1164    Accepted Submission(s): 482


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 2ABCCDEEFGFABE0 0
 

Sample Output
great-grandparent-
 

很明显的搜索题,我用的dfs做的,先正搜,如果搜到说明是父辈中的关系,如果搜不到再反过来搜,这就是子辈中的关系,如果有关系就要获得关系深度,之后就是输出时要注意几点就ok了。

#include <cstdio>#include <climits>const int MAX = 'Z'+1;char dic[MAX][2];void init(){int i;for(i='A';i<MAX;++i){dic[i][0]=dic[i][1]='-';}}int min(int a,int b){if(a>b)a = b;return a;}int dfs(char ca,char cb,int level){if(ca=='-')return INT_MAX;if(ca==cb)return level+1;int la,lb;la = dfs(dic[ca][0],cb,level+1);lb = dfs(dic[ca][1],cb,level+1);return min(la,lb);}void print(int cnt,bool mark){if(mark){if(cnt==2){printf("child\n");}else{while(cnt>3){printf("great-");--cnt;}printf("grandchild\n");}}else{if(cnt==2){printf("parent\n");}else{while(cnt>3){printf("great-");--cnt;}printf("grandparent\n");}}}int main(){int n,m,i,cnt;bool mark;char ca,cb,cc;while(scanf("%d %d%*c",&n,&m)){if(n==0 && m==0)break;init();for(i=0;i<n;++i){scanf("%c%c%c%*c",&ca,&cb,&cc);dic[ca][0] = cb;dic[ca][1] = cc;}for(i=0;i<m;++i){scanf("%c%c%*c",&ca,&cb);mark = true;cnt = dfs(ca,cb,0);//现在父辈中找if(cnt==INT_MAX){//前者不是后者的父辈mark = false;cnt = dfs(cb,ca,0);//反过来找}if(cnt==INT_MAX){printf("-\n");continue;}print(cnt,mark);}}return 0;}




3 0
原创粉丝点击