题解 | #找出直系亲属#

找出直系亲属

http://www.nowcoder.com/practice/2c958d09d29f46798696f15ae7c9703b

在并查集的基础上进行多支路的修改

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <vector>

using namespace std;

//本题父亲母亲都有,也没有说是独生子女,怎么说  强行递归?

//可以用一个visit数组来进行剪枝  每个人都是大写英文字母

const int MAXN = 30;

bool visit[MAXN]; 

class parent{
public:
	int mother;
	int father;
	parent():mother(-1),father(-1){}
	parent(int a, int b):mother(a),father(b){}
};

int Find(int x, vector<parent> &v, int target, int cengshu){//初步设计:没遇到就返回0,遇到了就返回寻找层数
	if(visit[x]){
		return 0;
	}else{
		visit[x] = true;
	}
	if(x == target){
		return cengshu;
	}
	if(v[x].mother == -1 && v[x].father == -1){
		return 0;
	}
	if(v[x].mother != -1){
		int direction1 = Find(v[x].mother, v, target, cengshu+1);
		if(direction1){//说明往母亲方向找到了 
			return direction1;
		}
	}
	if(v[x].father != -1){
		return Find(v[x].father, v, target, cengshu+1);//母亲那边没过的话,这边过了就是过了,没过就没过
	}
	return 0;
}

void Union(int x, int y, int z, vector<parent> &v){
	if(y != -1){
		v[x].mother = y;
	}
	if(z != -1){
		v[x].father = z;
	}
}

int main(){
	int n, m;
	while(scanf("%d%d", &n, &m) != EOF){
		memset(visit, false, sizeof(visit));
		vector<parent> v;
		for(int i=0; i<26; i++){
			v.push_back(parent());
		}
		string s;
		for(int i=0; i<n; i++){
			cin >> s;
			int y, z;
			if(s[1] != '-'){
				y = s[1]-'A';
			}else{
				y = -1;
			}
			if(s[2] != '-'){
				z = s[2]-'A';
			}else{
				z = -1;
			}
			Union(s[0]-'A', y, z, v);
		}
		for(int i=0; i<m; i++){//比如输入FA,是问F是A的谁 
			cin >> s;
			int find1 = Find(s[0]-'A', v, s[1]-'A', 0);
			memset(visit, false, sizeof(visit));
			if(find1){//从F往上找找到了A,说明F是A的后辈 
				while(find1 > 2){
					printf("great-");
					find1--;
				}
				if(find1 == 2){
					printf("grandchild\n");
				}else{
					printf("child\n");
				}
				continue;
			}
			int find2 = Find(s[1]-'A', v, s[0]-'A', 0);
			memset(visit, false, sizeof(visit));
			if(find2){//从A往上找找到了F,说明F是A的祖辈 
				while(find2 > 2){
					printf("great-");
					find2--;
				}
				if(find2 == 2){
					printf("grandparent\n");
				}else{
					printf("parent\n");
				}
				continue;
			}
			printf("-\n");
		}
	}
	return 0;
}
全部评论

相关推荐

牛客96763241...:杭电✌️也是打完招呼,没人回吗
点赞 评论 收藏
分享
来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务