题目链接: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