《数据结构学习与实验指导》4-5:家谱处理
2017-06-26 22:06
375 查看
输入说明:输入第1行给出2个正整数N(2<=N<=100)和M(M<=100),其中N为家谱中名字的数量,M伟家谱中陈述句的数量。接下来输入的每行不超过70个字符。名字的字符串有不超过10个英文字母组成。在家谱中的第一行给出的名字前没有缩进空格。家谱中的其他名字至少缩进2个空格,即他们是家谱中最早祖先的后代,且如果家谱中一个名字前缩进K个空格,则下一行中空格名字至多缩进k+2个空格。一个家谱中同样的名字不会出现两次,且家谱中没有出现的名字不会出现在陈述句中。
陈述句格式如下:
X is a child of Y
X is the parent of Y
X is a sibling of Y
X is a descendant of Y
X is an ancestor of Y
输出说明:对于测试用例中的每句陈述句,如果陈述为真,在一行中输出True;如果陈述为假,在一行中输出False。
陈述句格式如下:
X is a child of Y
X is the parent of Y
X is a sibling of Y
X is a descendant of Y
X is an ancestor of Y
输出说明:对于测试用例中的每句陈述句,如果陈述为真,在一行中输出True;如果陈述为假,在一行中输出False。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxN 101 #define MaxName 11 #define MaxSentence 71 typedef struct Node { char name[MaxName]; int level; int parent; } *PNode; typedef struct Tree{ struct Node array[MaxN]; int size; } *PTree; int N, M; PTree init(); void input(PTree tree, char name[], int level); int find(PTree tree, char n[]); void check(PTree tree, char n1[], char n2[], int relation); int main() { scanf("%d %d\n", &N, &M); PTree tree = init(); int i; for (i = 1; i <= N; i++) { char c[MaxName]; gets(c); int j = 0; while (c[j] == ' ') { j++; } input(tree, c + j, j / 2); } for (i = 1; i <= M; i++) { char c[MaxSentence]; gets(c); char n1[MaxName], n2[MaxName]; int relation = 0; char *x = strstr(c, " is"); strncpy(n1, c, x - c); n1[x - c] = '\0'; x = strstr(c, "of"); strncpy(n2, x + 3, strlen(c) - (x + 3 - c)); n2[strlen(c) - (x + 3 - c)] = '\0'; if (strstr(c, "child") - c > 0) { relation = 1; } else if (strstr(c, "parent") - c > 0) { relation = 2; } else if (strstr(c, "sibling") - c > 0) { relation = 3; } else if (strstr(c, "descendant") - c > 0) { relation = 4; } else if (strstr(c, "ancestor") - c > 0) { relation = 5; } check(tree, n1, n2, relation); } return 0; } PTree init() { PTree tree = (PTree) malloc(sizeof(struct Tree)); tree->size = 0; int i; for (i = 1; i <= N; i++) { tree->array[i].level = 0; tree->array[i].parent = i; } return tree; } void input(PTree tree, char name[], int level) { int curIndex = tree->size; tree->size++; PNode node = tree->array + tree->size; strcpy(node->name, name); node->level = level; int parent = curIndex; if (tree->size != 1) { while (tree->array[parent].level >= level) { parent = tree->array[parent].parent; } } node->parent = parent; } int find(PTree tree, char n[]) { if (tree->size == 0) { return -1; } int i; for (i = 1; i < tree->size; i++) { if (strcmp(n, tree->array[i].name) == 0) { break; } } return i; } void check(PTree tree, char n1[], char n2[], int relation) { int flag = 0; int i1 = find(tree, n1); int i2 = find(tree, n2); switch (relation) { case 1: if (tree->array[i1].parent == i2) { flag = 1; } break; case 2: if (tree->array[i2].parent == i1) { flag = 1; } break; case 3: if (tree->array[i1].parent == tree->array[i2].parent) { flag = 1; } break; case 4: while (i1 != 0 && i1 != i2) { i1 = tree->array[i1].parent; } if (i1 != 0 && i1 == i2) { flag = 1; } break; case 5: while (i2 != 0 && i2 != i1) { i2 = tree->array[i2].parent; } if (i2 != 0 && i2 == i1) { flag = 1; } } if (flag) { printf("True\n"); } else { printf("False\n"); } }
相关文章推荐
- 5-27 家谱处理 (map,vector)
- PTA 7-2 家谱处理——模拟
- pta 习题集5-17 家谱处理
- PTA 家谱处理
- pta 习题集5-17 家谱处理
- 家谱处理
- 家谱处理(30 分)
- 5-27 家谱处理 (30分)
- pat Data structure --4-05家谱处理 数据结构实验项目
- PTA 7-2 家谱处理
- PTA家谱处理
- 天梯赛补题 - 家谱处理
- 7-5 家谱处理(30 分) 【数据结构】
- PTA - 家谱处理 ( 数据结构 )
- 家谱处理(30 分)
- 数据结构课设 家谱处理 (map)
- PAT4-05. 家谱处理
- PAT 数据结构集 4-05 家谱处理
- 家谱处理(30 分)
- TOJ 4692: 数据结构—家谱处理