![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
//在这个程序中包含了对字符串,字符操作的各种函数,
//比如按字符从大到小排序、按字符串从大到小排序、qsort()函数、字符串比较函数strcmp()、字符串复制函数strcpy()
//以及本题对字符串的处理思想-----------------值得我们汲取!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//定义了qsort(待排序数组,参加排序的元素个数,每个元素占用的字节数,排序方式).
int n;
char word[2000][11],sorted[2000][11];
//字符从小到大比较的排序函数
int cmp_char(const void* _a,const void* _b)
{
char *a=(char*)_a;
char *b=(char*)_b;
return (*a - *b);//排序函数中,只有返回TRUE时才进行某些操作;当返回FALSE时,不理会。
//因此,若*a<=*b则不理会;若*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()
{
n=0;
for(;;)
{
//字典中的每一个字符串都放入word[]字符串数组中
scanf("%s",word[n]);
if(word[n][0]=='*')
break;
n++;
}
//对word[]字符串数组中的字符串元素进行从小到大的排序
qsort(word,n,sizeof(word[0]),cmp_string);
int i;
for(i=0;i<n;i++)
{
//将word[]数组复制给sorted[]数组
strcpy(sorted[i],word[i]);
//对sorted[]数组中的每一个字符串元素里的字符进行从大到小的排序
qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char);
}
char str[11];
while(scanf("%s",str)==1)
{
//统一规格,方便比较,beautiful!!!
//对接收的字符串里的字符也进行从大到小的排序,为比较最好准备
qsort(str,strlen(str),sizeof(char),cmp_char);
int found=0;
for(i=0;i<n;i++)
{
//由于字符都是按从小到大的顺序进行排序的,因此,可以很容易比较字符串是否相等
if(strcmp(str,sorted[i])==0)
{
found=1;
printf("%s ",word[i]);
}
}
if(!found)
printf(":(" );
printf("\n");
}
return 0;
}
本博客中的程序是针对刘佳汝作者的《算法竞赛入门经典》书籍里的5.3.2字母重排问题的。感觉对自己帮助挺大了,让自己学到了很多东西,故整理到博客上。