您的位置:首页 > 其它

hdu 1113 Word Amalgamation 解题报告

2013-07-31 22:02 375 查看
题目链接: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[105][10];
char sorted[105][10];
char word[10];

// 字符比较函数
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 = 0;
while (1)
{
scanf("%s", dic
);
if (dic
[0] == 'X')  // 遇到结束标志就终止循环
break;
n++;
}
qsort(dic, n, sizeof(dic[0]), cmp_string);  // 给字典中所有单词排序(单词与单词之间)
/*
for (i = 0; i < n; i++)
{
cout << dic[i] << "\t";
}
cout << endl;
*/
for (i = 0; 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 = 0;
if (word[0] == 'X')
break;
qsort(word, strlen(word), sizeof(char), cmp_char);  // 给输入单词排序
//    cout << word << endl;
for (i = 0; i < n; i++)
{
if (strcmp(sorted[i], word) == 0)
{
printf("%s\n", dic[i]);   // 输出原始单词,而不是排序后的
flag = 1;
}
}
if (!flag)
printf("NOT A VALID WORD\n");
printf("******\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: