题目描述
在美国数以百万计的报纸中,有一种单词游戏称为猜词。游戏的目标是猜谜,为了找出答案中缺少的字母,有必要对4个单词的字母顺序重新调整。在本题中,你的任务是编写程序实现对单词中的字母顺序重新调整。
输入
输入文件包含4部分:
(1) 一部字典,包含至少1个单词,至多100个单词,每个单词占一行;
(2) 字典后是一行字符串“XXXXXX”,表示字典结束;
(3) 一个或多个被打乱字母顺序的“单词”,每个单词占一行,你必须整理这些字母的顺序;
(4) 输入文件的最后一样为字符串“XXXXXX”,代表输入文件结束。
所有单词,包括字典中的单词和被打乱字母顺序的单词,都只包含小写英文字母,并且至少包含一个字母,至多包含6个字母。字典中的单词不一定是按顺序排列的,但保证字典中的单词是唯一的。
输出
对输入文件中每个被打乱字母顺序的单词w,按字母顺序输出字典中所有满足以下条件的单词的列表:通过调整单词w中的字母顺序,可以变成字典中的单词。列表中的每个单词占一行。如果列表为空(即单词w不能转换成字典中的任何一个单词),则输出一行字符串“NOT A VALID WORD”。以上两种情形都在列表后,输出一行包含6个星号字符的字符串,表示列表结束。
样例输入
tarp
given
score
refund
only
trap
work
earn
course
pepper
part
XXXXXX
resco
nfudre
aptr
sett
oresuc
XXXXXX
样例输出
score
******
refund
******
part
tarp
trap
******
NOT A VALID WORD
******
course
******
代码实现
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct dic{
char str[10];
char sorted[10];
}dic[100];
int compare(const void*a,const void* b)
{
struct dic* m=(struct dic*)a;
struct dic* n=(struct dic*)b;
return strcmp(m->str , n->str);
}
int main()
{
int i=0;
int j;
char s[10];
while(cin>>dic[i].str && strcmp(dic[i].str,"XXXXXX")){
strcpy(dic[i].sorted,dic[i].str);
sort(dic[i].sorted,dic[i].sorted+strlen(dic[i].sorted)); //sort函数
i++;
}
qsort(dic,i,sizeof(dic[0]),compare); //qsort函数
while(cin>>s && strcmp(s,"XXXXXX")){
int flag=0;
sort(s,s+strlen(s));
for(j=0;j<i;j++){
if(strcmp(s,dic[j].sorted)==0){
cout<<dic[j].str<<endl;
flag=1;
}
}
if(flag==0){
cout<<"NOT A VALID WORD"<<endl;
}
cout<<"******"<<endl;
}
return 0;
}