首页 > 代码库 > hdu - 4782 - Beautiful Soup(模拟)

hdu - 4782 - Beautiful Soup(模拟)

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include <cstdio>  
  2. #include <cstring>  
  3.   
  4. const int MAXN = 200;  
  5. const char* stop = "</html>";  
  6.   
  7. char ch;  
  8.   
  9. bool IsSpace(char ch)  
  10. {  
  11.     return ch == 32 || ch == 9 || ch == 10;  
  12. }  
  13.   
  14. void PrintSpace(int n)  
  15. {  
  16.     while (n--)  
  17.     {  
  18.         putchar(‘ ‘);  
  19.     }  
  20. }  
  21.   
  22. void RemoveSpace()  
  23. {  
  24.     while ((ch = getchar()) && IsSpace(ch));  
  25. }  
  26.   
  27. void Enter()  
  28. {  
  29.     putchar(‘\n‘);  
  30. }  
  31.   
  32. void GetEntireTag(char* tag)  
  33. {  
  34.     int len = 0;  
  35.     tag[len++] = ‘<‘;  
  36.     while ((ch = getchar()) && ch != ‘>‘)  
  37.     {  
  38.         tag[len++] = ch;  
  39.     }  
  40.     tag[len++] = ‘>‘;  
  41.     tag[len] = ‘\0‘;  
  42. }  
  43.   
  44. void OutputTag(const char* tag, const int& spaceCnt)  
  45. {  
  46.     if (tag[1] == ‘/‘)  
  47.     {  
  48.         PrintSpace(spaceCnt - 1);  
  49.     }  
  50.     else  
  51.     {  
  52.         PrintSpace(spaceCnt);  
  53.     }  
  54.     puts(tag);  
  55. }  
  56.   
  57. void UpdateSpace(const char* tag, int& spaceCnt)  
  58. {  
  59.     int len = strlen(tag);  
  60.   
  61.     if (tag[1] != ‘/‘ && tag[len - 2] != ‘/‘)  
  62.     {  
  63.         ++spaceCnt;  
  64.     }  
  65.     else if (tag[1] == ‘/‘)  
  66.     {  
  67.         --spaceCnt;  
  68.     }  
  69. }  
  70.   
  71. void GetAndOutputEntireText(const int& spaceCnt)  
  72. {  
  73.     PrintSpace(spaceCnt);  
  74.     putchar(ch);  
  75.     while ((ch = getchar()) && ch != ‘<‘)  
  76.     {  
  77.         if (IsSpace(ch))  
  78.         {  
  79.             RemoveSpace();  
  80.             if (ch == ‘<‘) break;  
  81.             else  
  82.             {  
  83.                 PrintSpace(1);  
  84.                 putchar(ch);  
  85.             }  
  86.         }  
  87.         else  
  88.         {  
  89.             putchar(ch);  
  90.         }  
  91.     }  
  92.     Enter();  
  93. }  
  94.   
  95. int main()  
  96. {  
  97.     int T, kase = 0;  
  98.     char tag[MAXN];  
  99.   
  100.     scanf("%d", &T);  
  101.     getchar();  
  102.     while (T--)  
  103.     {  
  104.         int spaceCnt = 0;  
  105.   
  106.         ch = getchar();  
  107.         printf("Case #%d:\n", ++kase);  
  108.         while (true)  
  109.         {  
  110.             if (IsSpace(ch))  
  111.             {  
  112.                 RemoveSpace();  
  113.             }  
  114.             else if (ch == ‘<‘)  
  115.             {  
  116.                 GetEntireTag(tag);  
  117.                 OutputTag(tag, spaceCnt);  
  118.                 if (strcmp(tag, stop) == 0) break;  
  119.                 UpdateSpace(tag, spaceCnt);  
  120.                 ch = getchar();  
  121.             }  
  122.             else  
  123.             {  
  124.                 GetAndOutputEntireText(spaceCnt);  
  125.             }  
  126.         }  
  127.     }  
  128.   
  129.     return 0;  

hdu - 4782 - Beautiful Soup(模拟)