您的位置:首页 > 其它

UVa 156 - Ananagrams

2012-07-17 16:32 399 查看
题意:给出一些单词,以#结束,判断这些单词是否是ananagram。如果是按字典序输出。

思路:每个大写字母变成小写,把单词中的字母按字典序排,再把单词按字典序排序,然后判断。最后输出没有改变的单词。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct
{
char s1[90];    //存放最初的单词。
char s2[90];    //存放小写排序后的单词。
int flag;      //标记是否ananagram。
}word;

int cmp1(const void *a, const void *b)    //字母排序
{
return *(char *)a-*(char *)b;
}

int cmp2(const void *a, const void *b)    //原单词排序
{
word *pa = (word *)a;
word *pb = (word *)b;
return strcmp(pa->s1, pb->s1);
}

int cmp3(const void *a, const void *b)    //改过的单词排序
{
word *pa = (word *)a;
word *pb = (word *)b;
return strcmp(pa->s2, pb->s2);
}

int main()
{
int i, j;
word w[1010];
i=0;
memset(w[i].s1, 0, sizeof(w[i].s1));
memset(w[i].s2, 0, sizeof(w[i].s2));
w[i].flag=0;              //0是ananagram
scanf("%s%*c", w[i].s1);
while(strcmp(w[i].s1, "#"))
{
for (j=0; j<strlen(w[i].s1); j++)
{
if (w[i].s1[j]>='A' && w[i].s1[j]<='Z')
{
w[i].s2[j]=w[i].s1[j]+32;        //大写变小写
continue;
}
w[i].s2[j]=w[i].s1[j];
}
i++;
memset(w[i].s1, 0, sizeof(w[i].s1));
memset(w[i].s2, 0, sizeof(w[i].s2));
w[i].flag=0;                  
scanf("%s%*c", w[i].s1);
}
for (j=0; j<i; j++)              //字母排序
{
qsort(w[j].s2, strlen(w[j].s2), sizeof(char), cmp1);
}
qsort(w, i, sizeof(word), cmp3);      //单词排序
for (j=0; j<i; j++)
{
if (strlen(w[j].s2)>1)        //单个字母是ananagram
{
if (strcmp(w[j].s2, w[j+1].s2) == 0)
{
w[j].flag++;
w[j+1].flag++;
}
}
}
qsort(w, i, sizeof(word), cmp2);    //单词排序
for (j=0; j<i; j++)
{
if (w[j].flag==0)
puts(w[j].s1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: