大二演算法期末複習-排序-單詞重組
單詞重組
Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)
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; }