大二算法期末复习-排序-单词重组

单词重组

Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)

Statistic

Problem Description

在美国数以百万计的报纸中,有一种单词游戏称为猜词。游戏的目标是猜谜,为了找出答案中缺少的字母,有必要对4个单词的字母顺序重新调整。在本题中,你的任务是编写程序实现对单词中的字母顺序重新调整。

Input

输入文件包含4部分:
(1) 一部字典,包含至少1个单词,至多100个单词,每个单词占一行;
(2) 字典后是一行字符串“XXXXXX”,表示字典结束;
(3) 一个或多个被打乱字母顺序的“单词”,每个单词占一行,你必须整理这些字母的顺序;
(4) 输入文件的最后一样为字符串“XXXXXX”,代表输入文件结束。
所有单词,包括字典中的单词和被打乱字母顺序的单词,都只包含小写英文字母,并且至少包含一个字母,至多包含6个字母。字典中的单词不一定是按顺序排列的,但保证字典中的单词是唯一的。

Output

对输入文件中每个被打乱字母顺序的单词w,按字母顺序输出字典中所有满足以下条件的单词的列表:通过调整单词w中的字母顺序,可以变成字典中的单词。列表中的每个单词占一行。如果列表为空(即单词w不能转换成字典中的任何一个单词),则输出一行字符串“NOT A VALID WORD”。以上两种情形都在列表后,输出一行包含6个星号字符的字符串,表示列表结束。

Sample Input

tarp
given
score
refund
only
trap
work
earn
course
pepper
part
XXXXXX
resco
nfudre
aptr
sett
oresuc
XXXXXX

Sample Output

score
******
refund
******
part
tarp
trap
******
NOT A VALID WORD
******
course
******

这道题我的思路是读取字典并按照字典顺序排序以后,每读取一个要查找的单词,把这个单词的每一个字母,分别在字典中使用二分查找,找到所有以该字母为首字母的单词,并判断每一个单词是否和要查找的单词都由相同的字母组成,然后按照要求输出即可。


#include<bits/stdc++.h>
using namespace std;
struct dic{
    char word[10];
};
int cmp(const void *a,const void *b){
    dic *p1 = (dic *)a;
    dic *p2 = (dic *)b;
    int i = 0;
    while(p1->word[i]==p2->word[i])i++;
    return p1->word[i]-p2->word[i];
}
bool same(char a[],char b[]){
    for(int i = 0;b[i]!='\0';i++){
        for(int j = 0;a[j]!='\0';j++){
            if(a[j]==b[i]){
                a[j]='.';
                break;
            }
        }
    }
    int i;
    for(i=0;a[i]!='\0';i++){
        if(a[i]!='.')return false;
    }
    if(b[i]!='\0')return false;
    return true;
}
int findOne(dic dicry[],char ch,int length,char str[]){
    int fir,mid,last;
    char temp[10];
    fir = 0;
    mid = length/2;
    last= length-1;
    while(dicry[mid].word[0] != ch){
        if(ch < dicry[fir].word[0] || ch > dicry[last].word[0]){
            return 0;
        }
        if(ch >= dicry[fir].word[0] && ch < dicry[mid].word[0]){
            last = mid-1;
            mid = (fir + mid)/2;
        }
        else if(ch > dicry[mid].word[0] && ch <= dicry[last].word[0]){
            fir = mid+1;
            mid = (last + mid)/2;
        }
    }
    int pos = mid;
    while(dicry[pos].word[0]==ch)
        pos--;
    int pd = 0;
    for(int i = pos+1;dicry[i].word[0]==ch;i++){
        strcpy(temp,str);
        if(same(temp,dicry[i].word)){
            pd = 1;
            cout<<dicry[i].word<<endl;
        }
    }
    if(pd == 0)
        return 0;
    else return 1;
}
dic dictionary[105];
int main()
{
	char input[10];
	int pos = 0;
	while(cin>>input && strcmp(input,"XXXXXX")!=0){
        strcpy(dictionary[pos].word,input);
        pos++;
    }
    qsort(dictionary,pos,sizeof(dictionary[0]),cmp);
    while(cin>>input && strcmp(input,"XXXXXX")!=0){
        int pd = 0;
        for(int mark = 0;input[mark]!='\0';mark++){
            if(findOne(dictionary,input[mark],pos,input)==1)
                pd = 1;
        }
        if(pd == 0){
            cout<<"NOT A VALID WORD"<<endl;
        }
        cout<<"******"<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40737057/article/details/84938340
今日推荐