zoukankan      html  css  js  c++  java
  • hdu 1113 Word Amalgamation 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1113

    题意:输入一个字典,然后再输入若干单词(每行中,1 <= 单词数 <= 100,并且每个单词在字典中保证是唯一的),用XXXXXX结尾来表示字典的结束。接着输入一个单词word(1 <= 字母个数 <= 6),每个单词你都需要在字典中找出所有可以用word的字母重排后得到的单词,并按照字典序从小到大的顺序在一行中输出;如果不存在,则输出“NOT A VALID WORD”。注意:字典中的单词不一定要按字典序顺序排列,但可以用word的字母重排后得到的单词必须要按字典序排列。

            这里参考了《算法竞赛入门经典》中的例题:字母重排 来做的,自以为看懂后能快速地写出来,但是发现好几个bug。这就是实践的重要性啊,不过还是很欣喜地通过这题学会了qsort函数(要包含头文件stdlib.h)的用法(

    http://baike.baidu.com/view/982231.htm)还有关于int cmp_string(const void *a,const void *b) 的理解(

    http://hi.baidu.com/lyb1900/item/4698682bd85389fa51fd875c

           三个qsort处理后的结果如下(以样例数据为例):

    样例数据:

    tarp  given  score  refund  only  trap  work  earn  course  pepper  part

    第一个:  qsort(dic, n, sizeof(dic[0]), cmp_string);

    course  earn  given  only  part  pepper  refund  score  tarp  trap  work

    第二个:    qsort(sorted[i], strlen(sorted[i]), sizeof(char), cmp_char);  

    ceorsu  aenr  eginv  lnoy  aprt  eepppr  defnru  ceors  aprt  aprt  korw

    第三个: qsort(word, strlen(word), sizeof(char), cmp_char);

    就是把输入的单词按字典序排序,比如输入nfudre,它就会变成defnru,然后比对回dic相应的位置,就能查出是refund这个单词了。

     1 #include <iostream>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 using namespace std;
     5 
     6 char dic[105][10];
     7 char sorted[105][10];
     8 char word[10];
     9 
    10 // 字符比较函数
    11 int cmp_char(const void *_a, const void *_b)
    12 {
    13     char *a = (char *)_a;
    14     char *b = (char *)_b;
    15     return *a - *b;
    16 }
    17 
    18 // 字符串比较函数
    19 int cmp_string(const void *_a, const void *_b)
    20 {
    21     char *a = (char *)_a;
    22     char *b = (char *)_b;
    23     return strcmp(a, b);
    24 }
    25 
    26 int main()
    27 {
    28     int i, n = 0;
    29     while (1)
    30     {
    31         scanf("%s", dic[n]);
    32         if (dic[n][0] == 'X')  // 遇到结束标志就终止循环
    33             break;
    34         n++;
    35     }
    36     qsort(dic, n, sizeof(dic[0]), cmp_string);  // 给字典中所有单词排序(单词与单词之间)
    37 /*
    38     for (i = 0; i < n; i++)
    39     {
    40         cout << dic[i] << "\t";
    41     }
    42     cout << endl;
    43 */
    44     for (i = 0; i < n; i++)
    45     {
    46     //    cout << dic[i] << '\t';
    47         strcpy(sorted[i], dic[i]);    // 字符串复制,注意不能直接用dic进行每个单词排序,否则会找不到字典中原有的单词
    48         qsort(sorted[i], strlen(sorted[i]), sizeof(char),    cmp_char);       // 给每个单词排序(单词内部)
    49     //    cout << sorted[i] << endl;
    50     }
    51     while (scanf("%s", word))
    52     {
    53         int flag = 0;
    54         if (word[0] == 'X')
    55             break;
    56         qsort(word, strlen(word), sizeof(char), cmp_char);  // 给输入单词排序
    57     //    cout << word << endl;
    58         for (i = 0; i < n; i++)
    59         {
    60             if (strcmp(sorted[i], word) == 0)
    61             {
    62                 printf("%s\n", dic[i]);   // 输出原始单词,而不是排序后的
    63                 flag = 1;
    64             }
    65         }
    66         if (!flag)
    67             printf("NOT A VALID WORD\n");
    68         printf("******\n");
    69     }
    70     return 0;
    71 }
    72             

         

  • 相关阅读:
    EC600S连接阿里云
    纪念首次使用vscode+platformio完成点灯全过程
    使用EC600S-CN实现短信收发功能
    基于stm32,通过更换数据存储扇区提升w25q128flash芯片使用寿命
    0.96寸OLED模块-简述如何修改OLED_ShowChar()函数达到修改显示字体大小的目的
    stm32定时器初始化后自动进入一次中断问题
    个人PSP升级作业
    第一个微信小项目
    自己设计大学排名-数据库实践
    自己的第一个网页
  • 原文地址:https://www.cnblogs.com/windysai/p/3228932.html
Copyright © 2011-2022 走看看