7-27 家譜處理(30 分)
阿新 • • 發佈:2018-02-04
tor lang -html 沒有 初始 實例 至少 getc truct 只有一個子女
人類學研究對於家族很感興趣,於是研究人員搜集了一些家族的家譜進行研究。實驗中,使用計算機處理家譜。為了實現這個目的,研究人員將家譜轉換為文本文件。下面為家譜文本文件的實例:
John
Robert
Frank
Andrew
Nancy
David
家譜文本文件中,每一行包含一個人的名字。第一行中的名字是這個家族最早的祖先。家譜僅包含最早祖先的後代,而他們的丈夫或妻子不出現在家譜中。每個人的子女比父母多縮進2個空格。以上述家譜文本文件為例,John
這個家族最早的祖先,他有兩個子女Robert
和Nancy
,Robert
有兩個子女Frank
和Andrew
,Nancy
David
。
在實驗中,研究人員還收集了家庭文件,並提取了家譜中有關兩個人關系的陳述語句。下面為家譜中關系的陳述語句實例:
John is the parent of Robert
Robert is a sibling of Nancy
David is a descendant of Robert
研究人員需要判斷每個陳述語句是真還是假,請編寫程序幫助研究人員判斷。
輸入格式:
輸入首先給出2個正整數N(2)和M(≤),其中N為家譜中名字的數量,M為家譜中陳述語句的數量,輸入的每行不超過70個字符。
名字的字符串由不超過10個英文字母組成。在家譜中的第一行給出的名字前沒有縮進空格。家譜中的其他名字至少縮進2個空格,即他們是家譜中最早祖先(第一行給出的名字)的後代,且如果家譜中一個名字前縮進k個空格,則下一行中名字至多縮進k+2個空格。
在一個家譜中同樣的名字不會出現兩次,且家譜中沒有出現的名字不會出現在陳述語句中。每句陳述語句格式如下,其中X
和Y
為家譜中的不同名字:
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
,如果陳述為假。
輸入樣例:
6 5 John Robert Frank Andrew Nancy David Robert is a child of John Robert is an ancestor of Andrew Robert is a sibling of Nancy Nancy is the parent of Frank John is a descendant of Andrew
輸出樣例:
True True True False False
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 struct Node 6 { 7 char name[15]; 8 char father[15]; 9 int num; //空格數 10 } people[102]; 11 12 int main() 13 { 14 int n,m; 15 char temp[75]; 16 int i,j,k; 17 scanf("%d %d",&n,&m); 18 getchar(); 19 20 for( i=0; i<n; i++) 21 { 22 people[i].num = 0; //空格數初始化為0 23 gets(temp); 24 int L = strlen(temp); 25 for( j=0; j<L; j++) 26 { 27 if( temp[j]==‘ ‘) 28 people[i].num++; 29 else 30 { 31 strcpy( people[i].name, temp+j); //復制空格以後的字符 32 break; 33 } 34 } 35 36 if( !people[i].num ) 37 strcpy( people[i].father,"root"); //如果空格數為0則表示根 38 else 39 { 40 for( k=i-1; k>=0; k--) 41 { 42 if( people[i].num> people[k].num) 43 { 44 //從後往前尋找父節點 45 strcpy( people[i].father,people[k].name); 46 break; 47 } 48 } 49 } 50 } 51 52 char a[15],b[15],c[15],d[15]; 53 char temp1[15],temp2[15]; 54 for( i=0; i<m; i++) 55 { 56 scanf("%s %s %s %s %s %s",a,d,d,b,d,c); 57 if( b[0] == ‘c‘) 58 { 59 //X is a child of Y 60 for( k=0; k<n; k++) 61 { 62 if( !strcmp( people[k].name,a)) 63 { 64 if( !strcmp( people[k].father,c)) 65 printf("True\n"); 66 else printf("False\n"); 67 break; 68 } 69 } 70 } 71 72 else if( b[0] == ‘p‘) 73 { 74 //X is the parent of Y 75 for( k=0; k<n; k++) 76 { 77 if( !strcmp( people[k].name,c)) 78 { 79 if( !strcmp( people[k].father,a)) 80 printf("True\n"); 81 else printf("False\n"); 82 break; 83 } 84 } 85 } 86 else if( b[0] == ‘s‘) 87 { 88 // X is a sibling of Y 89 for( k=0; k<n; k++) 90 { 91 //尋找兩個結點的父節點 92 if( !strcmp( people[k].name,a)) 93 strcpy(temp1,people[k].father); 94 if( !strcmp( people[k].name,c)) 95 strcpy(temp2,people[k].father); 96 } 97 if( !strcmp(temp1,temp2)) printf("True\n"); 98 else printf("False\n"); 99 } 100 else if( b[0] == ‘d‘) 101 { 102 //X is a descendant of Y 103 for( k=0; k<n; k++) 104 { 105 if( !strcmp( people[k].name,a)) 106 107 strcpy(temp1,people[k].father); 108 } 109 while( strcmp(temp1,c) && strcmp( temp1,"root")) 110 { 111 for( k=0; k<n; k++) 112 if( !strcmp(people[k].name,temp1)) 113 strcpy( temp1,people[k].father); 114 115 } 116 if( !strcmp(temp1,"root")) 117 printf("False\n"); 118 else printf("True\n"); 119 } 120 else if( b[0] == ‘a‘) 121 { 122 //X is an ancestor of Y 123 for( k=0; k<n; k++) 124 { 125 if( !strcmp( people[k].name,c)) 126 127 strcpy(temp1,people[k].father); 128 } 129 while( strcmp(temp1,a) && strcmp( temp1,"root")) 130 { 131 for( k=0; k<n; k++) 132 if( !strcmp(people[k].name,temp1)) 133 strcpy( temp1,people[k].father); 134 135 } 136 if( !strcmp(temp1,"root")) 137 printf("False\n"); 138 else printf("True\n"); 139 } 140 } 141 getchar(); 142 return 0; 143 }
7-27 家譜處理(30 分)