家谱文件中,每一行代表一个人名,第一行的名字是家族最早的祖先,家谱仅包含最早祖先的后代。每个人的子女比父母右缩两个空格。
基本要求:
(1)按示例输入家族关系,建立家族族谱;
(2)输入任意两个人名,能判断出两个人的关系(双亲和子女的关系,兄弟姐妹的关系,祖父母和孙辈的关系);
(3)事先有存好的家谱图的文件,从文件中读取后再对(2)进行判断。
求会的朋友们帮帮忙,指点迷津!
#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <vector>
using namespace std;
// 定义一个 Person 类表示一个人
class Person {
public:
string name;
Person* mother;
Person* father;
vector<Person*> children;
Person(string name) : name(name), mother(nullptr), father(nullptr) {}
};
// 定义一个 Family 类表示一个家庭
class Family {
public:
map<string, Person*> persons;
// 从文件中读取家谱图
void readFromFile(string filename) {
ifstream file(filename);
string line;
while (getline(file, line)) {
// 判断是否是空行
if (line.empty()) continue;
// 计算当前行的缩进级别
int indent = 0;
while (indent < line.size() && line[indent] == ' ') indent++;
// 获取当前行的人名
string name = line.substr(indent);
// 根据缩进级别来建立家谱关系
Person* person = new Person(name);
if (indent == 0) {
// 如果是家谱的最早祖先,直接添加到 persons 中
persons[name] = person;
} else {
// 否则,将当前人添加到缩进级别比他低的上一个人的 children 中
vector<Person*>& siblings = persons[line.substr(0, indent - 2)]->children;
siblings.push_back(person);
if (siblings.size() == 1) {
// 如果当前人是第一个孩子,那么他就是兄弟姐妹中的长子
person->mother = siblings[0]->mother;
person->father = siblings[0]->father;
} else {
// 否则,他就是兄弟姐妹中的晚辈
person->mother = siblings[0]->mother;
person->father = siblings[0]->father;
}
}
}
}
// 判断两个人之间的关系
string getRelation(string name1, string name2) {
Person* person1 = persons[name1];
Person* person2 = persons[name2];
if (!person1 || !person2) {
// 如果有一个人不存在,那么他们之间没有关系
return "unrelated";
}
if (person1 == person2) {
// 如果两个人是同一个人,那么他们之间的关系是自己
return "self";
}
if (person1->mother == person2 || person1->father == person2) {
// 如果 person1 的父母是 person2,那么 person1 和 person2 之间的关系是子女和双亲
return "child";
}
if (person2->mother == person1 || person2->father == person1) {
// 如果 person2 的父母是 person1,那么 person1 和 person2 之间的关系是子女和双亲
return "parent";
}
if (person1->mother == person2->mother || person1->father == person2->father) {
// 如果 person1 和 person2 的父母是同一个人,那么 person1 和 person2 之间的关系是兄弟姐妹
return "sibling";
}
if (isAncestor(person1, person2)) {
// 如果 person1 是 person2 的祖先,那么 person1 和 person2 之间的关系是祖先和后代
return "ancestor";
}
if (isAncestor(person2, person1)) {
// 如果 person2 是 person1 的祖先,那么 person1 和 person2 之间的关系是祖先和后代
return "descendant";
}
// 如果以上条件都不满足,那么 person1 和 person2 之间没有关系
return "unrelated";
}
private:
// 判断 person1 是否是 person2 的祖先
bool isAncestor(Person* person1, Person* person2) {
if (!person1 || !person2) return false;
if (person1 == person2) return true;
// 递归检查 person1 是否是 person2 的父母的祖先
return isAncestor(person1, person2->mother) || isAncestor(person1, person2->father);
}
};
int main() {
Family family;
// 从文件中读取家谱图
family.readFromFile("family.txt");
// 判断两个人之间的关系
cout << family.getRelation("John", "Jane") << endl;
cout << family.getRelation("Jane", "John") << endl;
cout << family.getRelation("John", "Mike") << endl;
cout << family.getRelation("Mike", "John") << endl;
cout << family.getRelation("Tom", "John") << endl;
cout << family.getRelation("John", "Tom") << endl;
return 0;
}
这是一份 ChatGPT 给出的题解,仅供参考。
(鉴于在 Stack Overflow 被封号过的经验:我不知道C站是否允许使用ChatGPT生成的内容作为答案,本次使用仅为了更准确、高效地帮助题主解决问题,本人仅在合理范围内使用,绝不会出现使用机器人刷回答等行为,若却有我未曾了解的社区规则规定了禁止相关内容,我将立即删除相关内容并道歉)