SWUST OJ 赋值了吗

偶尔善良 提交于 2020-03-16 08:49:29

赋值了吗?

 

Time Limit:   1000MS       Memory Limit:   65535KB
Submissions:   170       Accepted:   48

 

Description

现在很多的程序设计语言中,赋值已经是一个不容忽视的问题,如果一个变量在未进行赋值的情况下使用,那么这个值将是不定的(哈哈,我已经被遭了好多次了)!而我写的程序用到的变量实在是太多了,又不想自己统计哪些变量是已经赋值了的,现在就请你帮我统计一下哪些变量已经赋值了。为了简化问题,我们假设最开始仅有变量a中有确定的值。变量为单个小写字母,每行恰好有三个字符,中间一个是赋值运算符'='。请编程求出含N行的程序段运行以后有哪些变量中有确定的值。并且该赋值表达式的出现顺序也即是其在程序中的相对顺序。

Input

T(1<= T <= 27) 表示测试实例个数 N (0 < N ≤ 100) 表示赋值表达式的个数 以下N行中,每行3个字符,为一条语句

Output

在一行中按字母表顺序给出所有有确定值的变量名,中间以一个空格隔开。 如果没有变量被赋值,则输出“none”。

Sample Input

3
1
a=a
2
b=c
c=d
4
b=a
c=d
d=b
e=f

Sample Output

a
none
a b d  这是一个并查集问题,开始时,只有a有值,当a为某个变量赋值的时候,便将该变量加入到a所在集合中,通过查询父节点便可知该变量是否赋值,有一种情况:b=c c=a这种情况下只有a,c有值,b没有赋值,在将两个节点合并之时,应该先查看右边的变量是否已经赋值,如果没有赋值,便不能将两个节点合并。

#include <stdio.h>

typedef struct
{
int parent;
int rank;
}TreeNode;

void Init(TreeNode *Node, int n)
{
int i;
for (i = 0; i <= 30; i++)
{
Node[i].parent = i;
Node[i].rank = 0;
}
}

int FindSet(TreeNode *Node, int n)
{
if (n != Node[n].parent)
{
return FindSet(Node, Node[n].parent);
}
else
{
return n;
}
}

void Union(TreeNode *Node, int n1, int n2)
{
if (FindSet(Node, n2) != 0)
{
return;
}
n1 = FindSet(Node, n1);
n2 = FindSet(Node, n2);
if (Node[n1].rank > Node[n2].rank)
{
Node[n2].parent = n1;
}
else
{
Node[n1].parent = n2;
if (Node[n1].rank == Node[n2].rank)
{
Node[n2].rank++;
}
}
}

int main()
{
int N;
int n;
TreeNode Node[105];
scanf("%d", &N);
char str[5];
char stra[100];
int t = 1;
while(N--)
{
t = 1;
scanf("%d", &n);
Init(Node, n);
for (int i = 0; i < n; i++)
{
scanf("%s", str);
stra[i] = str[0];
if (str[0] == 'a' || str[2] == 'a')
{
t = 0;
}
Union(Node, str[0] - 'a', str[2] - 'a');
}
int f = 0;
int j;
int q = 0;
for (j = 0 + t; j < 30; j++)
{
if (FindSet(Node, j) == 0)
{
f = 1;
if (q == 0)
{
printf("%c", j + 'a');
q++;
}
else
{
printf(" %c", j + 'a');
q++;
}
}
}
if (f == 0)
{
printf("none\n");
}
else
{
printf("\n");
}
}
return 0;
}

 

 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!