hdu 1113 Word Amalgamation 解题报告

时间:2022-09-16 23:42:41

题目链接: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这个单词了。

 #include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std; char dic[][];
char sorted[][];
char word[]; // 字符比较函数
int cmp_char(const void *_a, const void *_b)
{
char *a = (char *)_a;
char *b = (char *)_b;
return *a - *b;
} // 字符串比较函数
int cmp_string(const void *_a, const void *_b)
{
char *a = (char *)_a;
char *b = (char *)_b;
return strcmp(a, b);
} int main()
{
int i, n = ;
while ()
{
scanf("%s", dic[n]);
if (dic[n][] == 'X') // 遇到结束标志就终止循环
break;
n++;
}
qsort(dic, n, sizeof(dic[]), cmp_string); // 给字典中所有单词排序(单词与单词之间)
/*
for (i = 0; i < n; i++)
{
cout << dic[i] << "\t";
}
cout << endl;
*/
for (i = ; i < n; i++)
{
// cout << dic[i] << '\t';
strcpy(sorted[i], dic[i]); // 字符串复制,注意不能直接用dic进行每个单词排序,否则会找不到字典中原有的单词
qsort(sorted[i], strlen(sorted[i]), sizeof(char), cmp_char); // 给每个单词排序(单词内部)
// cout << sorted[i] << endl;
}
while (scanf("%s", word))
{
int flag = ;
if (word[] == 'X')
break;
qsort(word, strlen(word), sizeof(char), cmp_char); // 给输入单词排序
// cout << word << endl;
for (i = ; i < n; i++)
{
if (strcmp(sorted[i], word) == )
{
printf("%s\n", dic[i]); // 输出原始单词,而不是排序后的
flag = ;
}
}
if (!flag)
printf("NOT A VALID WORD\n");
printf("******\n");
}
return ;
}