zoukankan      html  css  js  c++  java
  • hdu 3786 寻找直系亲属

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3786

    题目思路: 我们用p[i]=j 来表示 i 的孩子是j (因为一个parent只有一个孩子,但是一个孩子有两个parent不好形成对应)

    然后初始化为-1,这样如果遇到父母不清楚的(‘-’) 还是-1,一遇到就break掉,把count还原为0;  如果是家族树上存在的两个结点,那么一定可以通过这样知道他们相隔的代数,于是就可以知道相应的称谓  一堆if-else  比较考基本功

    代码:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    
    int p[26];
    /*
    int chartoint(char  ch)
    {
        if(ch=='0')  return 0;
        else if(ch=='1')  return 1;
        else if(ch=='2')  return 2;
        else if(ch=='3')  return 3;
        else if(ch=='4')  return 4;
        else if(ch=='5')  return 5;
        else if(ch=='6')  return 6;
        else if(ch=='7')  return 7;
        else if(ch=='8')  return 8;
        else if(ch=='9')  return 9;
        else if(ch=='-')  return -1;
    
    }
    */
    int main()
    {
       int n,m;
       while(cin>>n>>m)
       {
           if(n==0&&m==0)  break;
           memset(p,-1,sizeof(p));
           char c;
           char p1;
           char p2;
    
           string s;
           for(int i=0;i<n;i++)
           {
              cin>>s;
              c=s[0];
              p1=s[1];
              p2=s[2];
    
             if(p1!='-') p[p1-'A']=c-'A';
             if(p2!='-') p[p2-'A']=c-'A';
    
           }
    
           char c1,c2;
           for(int i=0;i<m;i++)
           {
              cin>>s;
              c1=s[0];
              c2=s[1];
    
              int count1=0,count2=0;
              int target1=c1-'A';
              int target2=c2-'A';
              int cur=target1;
              while(cur!=target2)
              {
                 cur=p[cur];
                 if(cur==-1)
                 {
                     count1=0;
                     break;
                 }
    
                 else  count1++;
    
              }
    
              if(count1==0)
              {
                 cur=target2;
                  while(cur!=target1)
              {
                 cur=p[cur];
                 if(cur==-1)
                 {
                     count2=0;
                     break;
                 }
                 else count2++;
    
              }
    
    
              }
    
             if(count1==0&&count2==0)
            {
               cout<<'-'<<endl;
    
            }
    
            else if(count1!=0)
            {
                if(count1==1)  cout<<"parent"<<endl;
                else if(count1==2)  cout<<"grandparent"<<endl;
                else
                {
                   while(count1>=3)
                   {
                       cout<<"great-";
                       count1--;
                   }
    
                     cout<<"grandparent"<<endl;
    
                }
            }
    
            else if(count2!=0)
            {
                if(count2==1)  cout<<"child"<<endl;
                else if(count2==2)  cout<<"grandchild"<<endl;
                else
                {
                   while(count2>=3)
                   {
                       cout<<"great-";
                       count2--;
                   }
    
                     cout<<"grandchild"<<endl;
    
                }
            }
           }
       }
    }
    




  • 相关阅读:
    (转+原)python中的浅拷贝和深拷贝
    (原)torch7中添加新的层
    (原+转)ubuntu终端输出彩色文字
    (原)torch中显示nn.Sequential()网络的详细情况
    (原)python中使用plt.show()时显示图像
    eclipse 注释模板
    leetcode 11 最大盛水容器
    leetcode 9 回文数字
    leetcode8 字符串转整数
    利用Intent启动activity的例子
  • 原文地址:https://www.cnblogs.com/814jingqi/p/3310426.html
Copyright © 2011-2022 走看看