1. 程式人生 > >大二演算法期末複習-排序-單詞重組

大二演算法期末複習-排序-單詞重組

單詞重組

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;
}