题目描述
给你一些已经确定的元素之间的关系,请你判断是否能从这些元素关系中推断出其他的元素关系。
输入
输入的第一行是一个整数N,表示测试数据的组数。
每组输入首先是一个正整数m$(m<=100)$,表示给定元素关系的个数。
接下来m行,每行一个元素关系,格式为:
$元素1<元素2$ 或者 $元素1>元素2$
元素用一个大写字母表示,输入中不会包含冲突的关系。
输出
对于每组输入,第一行输出“Case d:”,d是测试数据的序号,从1开始。
接下来输出所有推断出的新的元素关系,按照字典序从小到大排序,格式为:
元素1<元素2
每个元素关系占一行,输入中给定的元素关系不要输出。
如果没有新的元素关系推断出来,则输出NONE。
样例输入
1 2 3 4 5 6 7 8
| 2 3 A<B C>B C<D 2 A<B C<D
|
样例输出
1 2 3 4 5 6
| Case 1: A<C A<D B<D Case 2: NONE
|
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <stdio.h> #include <string.h> int main() { int t,n; int a[30][30]; int flag[30][30]; char s[5]; scanf("%d",&t); int count=1; while(t--) { memset(a,0,sizeof(a)); memset(flag,0,sizeof(flag)); scanf("%d",&n); while(n--) { scanf("%s",s); int u=s[0]-'A'; int v=s[2]-'A'; if(s[1]=='<') { a[u][v]=1; flag[u][v]=1; } else { a[v][u]=1; flag[v][u]=1; } } printf("Case %d:\n",count++); int Flag=0; for(int k=0;k<30;k++) { for(int i=0;i<30;i++) { for(int j=0;j<30;j++) if(a[i][k]&&a[k][j]) a[i][j]=1;//Flag=1;加在这里会WA } } for(int i=0;i<30;i++) { for(int j=0;j<30;j++) if(a[i][j]&&!flag[i][j])//flag[i][j]=1说明是递推出来的关系 { printf("%c<%c\n",i+'A',j+'A'); Flag=1;//能够递推出关系 } } if(Flag==0) printf("NONE\n"); } return 0; }
|