zoukankan      html  css  js  c++  java
  • SWUST OJ 赋值了吗

    赋值了吗?

    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;
    }

     
  • 相关阅读:
    080626 雨(近期目标)
    6月25日 多云
    火一样的冷
    sgu107. 987654321 problem 简单打表 难度:0
    快速切题 sgu 111.Very simple problem 大数 开平方 难度:0 非java:1
    sgu114. Telecasting station 难度:1
    109. Magic of David Copperfield II 构造 难度:2
    sgu108. Selfnumbers 2 滚动数组 打表 难度:1
    快速切题 sgu115. Calendar 模拟 难度:0
    快速切题 sgu117. Counting 分解质因数
  • 原文地址:https://www.cnblogs.com/lzmfywz/p/3014820.html
Copyright © 2011-2022 走看看