Procesamiento del árbol genealógico (30 puntos) (mapeo de mapas)

La investigación antropológica está muy interesada en las familias, por lo que los investigadores recopilaron genealogías de algunas familias para la investigación. En el experimento, se utilizó una computadora para procesar el árbol genealógico. Para lograr este objetivo, los investigadores convirtieron el árbol genealógico en un archivo de texto. El siguiente es un ejemplo de un archivo de texto de genealogía:

En el archivo de texto del árbol genealógico de John
Robert
Frank
Andrew
Nancy
David
, cada línea contiene el nombre de una persona. El nombre de la primera línea es el antepasado más antiguo de esta familia. La genealogía solo contiene a los descendientes del antepasado más antiguo, y sus maridos o esposas no aparecen en la genealogía. Los hijos de todos tienen sangría 2 espacios más que sus padres. Tomemos como ejemplo el archivo de texto de genealogía anterior: el antepasado más antiguo de la familia de John tiene dos hijos, Robert y Nancy, Robert tiene dos hijos, Frank y Andrew, y Nancy sólo tiene un hijo, David.

En el experimento, los investigadores también recopilaron documentos familiares y extrajeron declaraciones sobre la relación entre dos personas en el árbol genealógico. El siguiente es un ejemplo de la oración de declaración de la relación en el árbol genealógico:

John es el padre de Robert
Robert es hermano de Nancy
David es descendiente de Robert Los
investigadores deben juzgar si cada afirmación es verdadera o falsa. Por favor, escriba un programa para ayudar a los investigadores a juzgar.
Formato de entrada: la
entrada primero da 2 números enteros positivos N (2≤N≤100) y M (≤100), donde N es el número de nombres en el árbol genealógico, M es el número de oraciones enunciados en el árbol genealógico y cada línea de entrada no excede los 70 caracteres.

La cadena del nombre consta de no más de 10 letras en inglés. No hay espacio de sangría antes del nombre dado en la primera línea de la genealogía. Otros nombres en el árbol genealógico deben tener una sangría de al menos 2 espacios, es decir, son descendientes del antepasado más antiguo en el árbol genealógico (el nombre dado en la primera línea), y si un nombre en el árbol genealógico tiene una sangría de k espacios antes del nombre, el nombre de la línea siguiente tendrá como máximo una sangría de k + 2 espacios.

El mismo nombre no aparecerá dos veces en una genealogía, y los nombres que no aparecen en la genealogía no aparecerán en la declaración. El formato de cada declaración es el siguiente, donde X e Y son nombres diferentes en el árbol genealógico:

X es un hijo de Y
X es el padre de Y
X es un hermano de Y
X es un descendiente de Y
X es un antepasado de Y
Formato de salida:
Para cada declaración en el caso de prueba, la salida Verdadero en una línea, si La declaración es verdadero, o falso, si la afirmación es falsa.

Ideas de preguntas:

1. Cómo mapear al padre de cada persona uno por uno, usar el mapeo de mapas y agregar una matriz auxiliar para ayudar a mapear bien.
2. Extraiga las palabras clave de la oración declarativa dada e identifique la relación entre otras personas.

#include<iostream>
#include<map>
#include<algorithm>
#include<string>
using namespace std;

void BuildFamily();
int n, m;
map<string, string> parent;
string ar[1000];
int main()
{
    
    
	bool table[1000] = {
    
     false }, k = 0;
	BuildFamily();
	int t = m;
	while (m--)
	{
    
    
		string a, b, c, e;
		cin >> a >> e >> e >> b >> e >> c;

		switch (b[0])
		{
    
    
		case'c':
			swap(a, c);		//放到下一步处理,所以没有加break;
		case'p':
			if (parent[c] == a)
				cout << "True\n";
			else
				cout << "False\n";
			break;
		case's':
			if (parent[a] == parent[c])
				cout << "True\n";
			else
				cout << "False\n";
			break;
		case'd':
			swap(a, c);			//放到下一步处理
		case'a':
			if (a == "root")
			{
    
    
				cout << "True\n";
				break;
			}
			else
			{
    
    
				while (parent[c] != a && parent[c] != "root")c = parent[c];
				if (parent[c] == a)				//要么parent[c]==a,要么parent[c]==root了
					cout << "True\n";
				else
					cout << "False\n";
				break;
			}
		}
	}
	return 0;
}
void BuildFamily()
{
    
    
	cin >> n >> m;
	getchar();			//吸收回车,确保下一步的getline正常运行
	for (int i = 0; i < n; i++)
	{
    
    
		string st;
		getline(cin, st);
		int cnt = count(st.begin(), st.end(), ' ');

		if (cnt == 0)	//把资历最老的祖先先定位好
		{
    
    
			parent[st] = "root";		
			ar[1] = st;
		}
		else
		{
    
    
			st = st.substr(cnt);	//如果有空格,跳过空格读取有效字符串
			parent[st] = ar[cnt / 2];	//通过空格的个数把等级划分
			ar[cnt / 2 + 1] = st;		//空格多的放在下一个等级
		}								//再草稿纸上画画这两个下标
	}
}

Supongo que te gusta

Origin blog.csdn.net/xdg15294969271/article/details/113995289
Recomendado
Clasificación