zoukankan      html  css  js  c++  java
  • hdu 1181:变形课(搜索水题)

    变形课

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


    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".
     
    Source
     
    Recommend
    JGShining   |   We have carefully selected several similar problems for you:  1312 1258 1242 1253 1045 

     
      搜索题
      一开始是个大水题,后来发现没有那么水。需要注意一些细节的处理。
      思路是找到开头为‘b’的咒语,开始搜索,中间可以借助别的咒语首尾衔接,直到找到结尾为‘m’的咒语。
      注意一个情况,当上一个咒语为“abc”的时候,下一个咒语不能是“cba”,即现在选择的这个咒语尾部字符,不能与之前选择的任何一个咒语的开头字符相等,否则会出现 Runtime Error(STACK_OVERFLOW) 错误,即栈溢出。出现这个错误的原因就是出现了无穷递归现象。
      参考代码:
     
     1 #include <iostream>
     2 using namespace std;
     3 
     4 char a[1010][500];
     5 char b[5000];   //递归的时候记录选中的字符串的开头字符
     6 int num;    //咒语的数量
     7 int index;
     8 
     9 int GetLength(int s)    //获取字符串的长度
    10 {
    11     int i;
    12     for(i=0;a[s][i];i++);
    13     return i;
    14 }
    15 bool dfs(int s)
    16 {
    17     int len = GetLength(s);
    18     if(a[s][len-1]=='m')
    19         return true;
    20     for(int i=0;i<num;i++){
    21         int t = GetLength(i);
    22         if(a[i][0]==a[s][len-1]){    //如果当前字符串尾不为‘m’,则需要找开头为当前字符串尾字符的字符串,继续找下去
    23             int j;
    24             for(j=0;j<index;j++){   //现在选的这个咒语的结尾字符,不能与之前选过的咒语的开头字符相等,否则会无穷递归下去。例如选了“abc”之后再选“cba”。
    25                 if(b[j]==a[i][t-1])
    26                     break;
    27             }
    28             if(j>=index)
    29                 b[index++] = a[i][0];
    30             else
    31                 continue;
    32             //可以选这条咒语
    33             if(dfs(i))
    34                 return true;
    35             else
    36                 index--;
    37         }
    38     }
    39     return false;
    40 }
    41 
    42 int main()
    43 {
    44     num = 0;
    45     index = 0;
    46     while(cin>>a[num++]){
    47         if(a[num-1][0]=='0'){
    48             num--;
    49             int i;
    50             for(i=0;i<num;i++)  //找到开头为‘b’的咒语进行搜索
    51                 if(a[i][0]=='b')
    52                     if(dfs(i)){
    53                         cout<<"Yes."<<endl;
    54                         break;
    55                     }
    56             if(i>=num)
    57                 cout<<"No."<<endl;
    58             num = 0;
    59             index = 0;
    60         }
    61     }
    62     return 0;
    63 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    Asp.net 动态添加Meta标签
    【转】在SharePoint Server 2010中更改“我的网站”
    SPQuery DateTime 类型查询
    Asp.net Web Application 打开 SharePoint 2010 Site 错误 The Web application at could not be found
    How To Create SharePoint 2010 Site Collection In Its Own DB
    C# 文件打印
    面试题 java集合
    《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
    《深入理解Java虚拟机》(五)JVM调优
    《深入理解Java虚拟机》(四)虚拟机性能监控与故障处理工具
  • 原文地址:https://www.cnblogs.com/yym2013/p/3623668.html
Copyright © 2011-2022 走看看