题解 | 找出直系亲属

找出直系亲属

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

#include<iostream>
//由题目可以发现一个人一个父亲一个母亲,并不符合并查集合的用一个数组来存
//并且也要注意到如果用两个数组来存即两个并查集的话,在查找一个元素是否是另外一个元素的父母时非常的麻烦
//因为他的曾祖母可能是其父亲的母亲或者是其母亲的母亲存在交叉关系根本没法遍历
//但是如果能反过来存就能发现是能用一个数组表示的,即存每个结点的孩子
//所以本题的破题点就是用孩子数组来存
using namespace std;
const int N = 27;
int children[30];

void Union(int parent, int child) {
	children[parent] = child;
}

int find(int x, int y) {
	int res = 0;
	int tmp = x;
	//主要看一个是不是他的儿子,这里找到说明y是x的儿子
	while (children[tmp] != tmp) {
		if (tmp == y)return res;
		tmp = children[tmp];
		res++;
	}
	//万一y就是根节点的话要再判断一次
	if(tmp==y)return res;
	//这里res=0别忘了
	res = 0;
	tmp = y;
	//x是y的儿子
	while (children[tmp] != tmp) {
		if (tmp == x)return -res;
		tmp = children[tmp];
		res++;
	}
	if(tmp==x)return -res;
	return 0;
}

int main() {
	int n, m;
	while (cin >> n >> m) {
		//初始化并查集
		for (int i = 0; i <= 26; i++)children[i] = i;
		/*cin >> n >> m 会读取两个整数,并且会忽略掉输入后的换行符(\n)。但输入流中依然存在换行符。
这个换行符并没有被清空,接下来读取字符时(即 cin >> child >> father >> mother),cin 直接读取到了该换行符。*/
		while (n--) {
			getchar();
			char child, father, mother;
			cin >> child >> father >> mother;//读取字符串的时候就是这样
			if (father != '-')Union(father-'A', child-'A');
			if (mother != '-')Union(mother-'A', child-'A');
		}
		while (m--) {
			char x, y;
			cin >> x >> y;
			int res=find(x-'A', y-'A');
			if (res == 0)cout << '-' << endl;
			else if (res > 0) {
				if (res == 1)printf("parent\n");
				else if (res == 2)printf("grandparent\n");
				else if (res > 2) {
					while (res - 2 > 0) {
						printf("great-");
						res--;
					}
					printf("grandparent\n");
				}
			}
			else if (res < 0) {
				//这里的负号别漏了
				if (res == -1)printf("child\n");
				else if (res == -2)printf("grandchild\n");

				else if (res < -2) {
					while (res + 2 < 0) {
						printf("great-");
						res++;
					}
					printf("grandchild\n");
				}
			}
		}
	}

	return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4274次浏览 75人参与
# AI面会问哪些问题? #
27625次浏览 552人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15162次浏览 221人参与
# 你的实习产出是真实的还是包装的? #
20103次浏览 342人参与
# 找AI工作可以去哪些公司? #
9011次浏览 233人参与
# 春招至今,你的战绩如何? #
64714次浏览 578人参与
# 米连集团26产品管培生项目 #
13327次浏览 285人参与
# 从事AI岗需要掌握哪些技术栈? #
8860次浏览 302人参与
# 你做过最难的笔试是哪家公司 #
33267次浏览 231人参与
# 中国电信笔试 #
31977次浏览 292人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340747次浏览 2174人参与
# 哪些公司真双非友好? #
69570次浏览 289人参与
# 阿里笔试 #
178475次浏览 1315人参与
# 机械人避雷的岗位/公司 #
62698次浏览 393人参与
# 第一份工作一定要去大厂吗 #
14491次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22065次浏览 280人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26245次浏览 310人参与
# 沪漂/北漂你觉得哪个更苦? #
9797次浏览 193人参与
# HR最不可信的一句话是__ #
6195次浏览 113人参与
# 应届生第一份工资要多少合适 #
20674次浏览 86人参与
# AI时代,哪个岗位还有“活路” #
11470次浏览 341人参与
# 春招你拿到offer了吗 #
831151次浏览 9986人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务