• 变形课


    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
    Total Submission(s): 11226    Accepted Submission(s): 4158


    Problem Description
    呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.
    Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.
     
    Input
    测试数据有多组。每组有多行,每行一个单词,仅包括小写字母,是Harry所会的所有咒语.数字0表示一组输入结束.
     
    Output
    如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)
     
    Sample Input
    so soon river goes them got moon begin big 0
     
    Sample Output
    Yes.
    Hint
    Hint
    Harry 可以念这个咒语:"big-got-them".
     
    快要疯了,一开始老是Runtime Error (ACCESS_VIOLATION) ,实在不知道哪里错了。突然领悟,当数据量超大时,当然会数组溢出,但是第二种方法不论数组多大多不会溢出。
    (一)( Runtime Error (ACCESS_VIOLATION)
    #include<iostream>
    using namespace std;
    char A[1000000000][2];
    int finis=0;
    int vis[1000000000];
    char end[5]="No.";
    void Dfs(char tail,int num)
    {
        if(tail=='m')
        {
            strcpy(end,"Yes.");
            finis=1;
            return;
        }
        vis[num]=0;
        for(int i=0;A[i][0]!='0';i++)
        {
            if(vis[i] && A[i][0]==tail)
            {
                Dfs(A[i][1],i);
                if(finis) return;
                vis[i]=1;
            }
        }
    }
    void main()
    {
        while(1)
        {
            finis=0;
            strcpy(end,"No.");
            char temp[100];
            int i=0;
            while(1)
            {
                cin>>temp;
                vis[i]=1;
                A[i][0]='0';
                if(temp[0]=='0') break;
                A[i][0]=temp[0];
                for(int j=0;temp[j]!='';j++) ;
                j--;
                A[i][1]=temp[j];
                i++;
            }
            for(i=0;A[i][0]!='0';i++)
                if(A[i][0]=='b')
                {
                    Dfs(A[i][1],i);
                    if(finis)
                        break;
                }
            cout<<end<<endl;
        }
    }
     
     
    (二)(这个不论数组多大都不会溢出,但是为什么,为什么老是超时啊。。)
    #include<iostream>
    using namespace std;
    int A[26][26];
    int vis[26][26];
    int finis;
    void Dfs(int tail)
    {
        if(finis)
            return;
        if(tail=12)
        {
            finis=1;
            return;
        }
        for(int i=0;i<26;i++)
            if(A[tail][i] && vis[tail][i])
            {
                vis[tail][i]=0;
                Dfs(i);
                vis[tail][i]=1;
            }
    }
    void main()
    {
        char temp[100];
        while(1)
        {
            finis=0;
            for(int i=0;i<26;i++)
                for(int j=0;j<26;j++)
                {
                    A[i][j]=0;
                    vis[i][j]=1;
                }
            while(cin>>temp)
            {
                if(temp[0]=='0')
                    break;
                int vt,vi;
                for(i=0;temp[i]!='';i++) ;
                i--;
                vt=temp[0]-'a';
                vi=temp[i]-'a';
                A[vt][vi]=1;
            }
            for(i=0;i<26;i++)
                if(A[1][i])
                {
                    vis[1][i]=0;
                    Dfs(i);
                    vis[1][i]=1;
                    if(finis) break;
                }
            if(finis)
                cout<<"Yes."<<endl;
            else
                cout<<"No."<<endl;
        }
    }
    (三)
    又写一个,又超时....
    #include<iostream>
    #include<string>
    using namespace std;
    char a[26][26];
    int test[26];//
    int Dfs(int h)
    {
     if(h==12)
     {
      cout<<"YES."<<endl;
      return 1;
     }
     test[h]=0;
     for(int i=0;i<26;i++)
     {
      int temp=0;
      if(a[h][i] && test[i])
      {
       temp=Dfs(i);
          if(temp)
           return 1;
      }
     }
     return 0;
    }
    void main()
    {
     string temp;
     while(1)
     {
      int start,tail;
      for(int i=0;i<26;i++)
      {
       test[i]=1;
       for(int j=0;j<26;j++)
        a[i][j]=0;
      }
      while(scanf("%s",&temp))
      {
       if(temp[0]=='0')
        break;
       start=(int)temp[0]-97;
       tail=(int)temp[temp.length()-1]-97;
       if(start==tail) continue;
       a[start][tail]=1;
      }
      int temp=0;
      if(a[1][12])
       temp=Dfs(12);
      else
       for(i=0;i<26;i++)
       {
        if(a[1][i])
        {
         temp=Dfs(i);
         test[1]=0;
        }
        if(temp) break;
       }
      if(temp==0)
       cout<<"No."<<endl;
     }
    }
     (四)不明白为什么还会超时

    #include<iostream>
    #include<string>
    using namespace std;
    char a[26][26];
    int test[26];
    int Dfs(int h)
    {
     if(h==12)
     {
      cout<<"YES."<<endl;
      return 1;
     }
     test[h]=0;
     for(int i=0;i<26;i++)
     {
      int temp=0;
      if(a[h][i] && test[i])
      {
       temp=Dfs(i);
          if(temp)
           return 1;
      }
     }
     return 0;
    }
    void main()
    {
     string temp;
     while(1)
     {
      int start,tail;
      for(int i=0;i<26;i++)
      {
       //test[i]=1;
       for(int j=0;j<26;j++)
        a[i][j]=0;
      }
      while(cin>>temp)
      {
       if(temp[0]=='0')
        break;
       start=(int)temp[0]-97;
       tail=(int)temp[temp.length()-1]-97;
       if(start==tail) continue;
       a[start][tail]=1;
      }
      for(i=0;i<26;i++)
       for(int j=0;j<26;j++)
        if(a[j][i])
         for(int k=0;k<26;k++)
          if(a[i][k]) a[j][k]=1;

     /* int temp=0;
      if(a[1][12])
       temp=Dfs(12);
      else
       for(i=0;i<26;i++)
       {
        if(a[1][i])
        {
         temp=Dfs(i);
         test[1]=0;
        }
        if(temp) break;
       }
      if(temp==0)
       cout<<"No."<<endl;*/
      if(a[1][12])
       cout<<"YES."<<endl;
      else
       cout<<"No."<<endl;

     }
    }

    ()

    #include<stdio.h>
    #include<string>
    char a[26][26];
    void main()
    {
     char temp[1001];
     int start,tail;
     int i,j,k;
     while(1)
     {
      memset(a,0,sizeof(a));
      while(scanf("%s",temp))
      {
       if(temp[0]=='0')
        break;
       start=(int)temp[0]-97;
       tail=(int)temp[strlen(temp)-1]-97;
       if(start==tail) continue;
       a[start][tail]=1;
      }
      for(i=0;i<26;i++)
       for(j=0;j<26;j++)
        if(a[j][i])
         for(k=0;k<26;k++)
          if(a[i][k]) a[j][k]=1;
      if(a[1][12])
       printf("Yes. ");
      else
       printf("No. ");
     }
    }

  • 相关阅读:
    LeetCode之移除元素
    有被开心到hh(日常)
    交换排序
    插入排序
    顺序查找&折半查找
    C++之引用
    MySQL学习笔记
    C/C++程序编译过程
    计算机面试知识整合(更新中...)
    MFC之编辑框
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3538964.html
Copyright © 2020-2023  润新知