《编程珠玑》里讲到了一个绝妙的算法例子。对一本词典,找出所有的变位词。变位词就是组成这几个单词的字母一样,但顺序不一样。这个变位词算法可以用于猜字谜之类的游戏。算法很巧妙,先找出相同模式的单词,用系统排序集中在一起,再输出有相同模式的变位词。该例子的重点是让我们知道,可以用一系列的小工具来完成一个非常复杂的过程,而不必编写一个专用的复杂混乱的代码。让我见识到了重定向和管道命令的妙用,整个程序由四个小程序组成的。
anagram_change.c 用于将原字典中大写的单词字母全部转化为小写
- #include <stdio.h>
- int main()
- {
- int c;
- while((c = getchar()) != EOF) {
- if(c >= 'A' && c <= 'Z')
- c += 32;
- printf("%c", c);
- }
- }
anagram_sign.c 将每个单词中字母排序,标识每个单词
- #include <stdio.h>
- #include <string.h>
- #define WORDMAX 50
- int charcomp(char *x, char *y)
- {
- return *x - *y;
- }
- int main()
- {
- char word[WORDMAX], sign[WORDMAX];
- while (scanf("%s", word) != EOF) {
- strcpy(sign, word);
- qsort(sign, strlen(sign), sizeof(char), charcomp);
- printf("%s %s\n", sign, word);
- }
- return 0;
- }
anagram_squash.c 将模式相同的单词输出在同一行上
- #include <stdio.h>
- #include <string.h>
- #define WORDMAX 50
- int main()
- {
- char word[WORDMAX], sig[WORDMAX], oldsig[WORDMAX];
- int linenum = 0;
- strcpy(oldsig, "");
- while (scanf("%s %s", sig, word) != EOF) {
- if(strcmp(oldsig, sig) != 0 && linenum > 0)
- printf("\n");
- strcpy(oldsig, sig);
- linenum++;
- printf("%s\t\t", word);
- }
- printf("\n");
- return 0;
- }
在win系统中 只要输入以下命令:
- anagram_change.exe < dictionary | anagram_sign.exe | sort | anagram_squash.exe > gramlist.txt
linux系统中也差不多。
阅读(1351) | 评论(0) | 转发(0) |