题目描述:
在美国各地的数百万份报纸中,有一款名为Jumble的文字游戏。 这个游戏是要解决一个谜语,但为了找到答案中出现的字母来解读四个字是必要的。 你的任务是编写一个可以解读单词的程序。
输入:输入文件包含4个部分: 1、字典,由至少一个,最多100个字组成,每行一个; 2、包含′XXXXXX′的行,表示字典的结尾; 3、一个或多个你必须解读的混乱的“单词”,每个单词都在一条线上; 4、包含'XXXXXX'的另一行,它表示文件的结尾。 所有单词,包括字典单词和加扰单词,仅由小写英语组成字母,长度至少为一个,最多六个字符, 字典不一定按排序顺序,但字典中的每个单词都是独特的。
输出:对于输入中的每个加扰字,输出可以是的所有字典单词的字母列表。 通过重新排列乱码中的字母而形成的。此列表中的每个单词都必须出现在一行中通过它自己。 如果列表为空(因为不能形成字典单词),则输出“NOT A VALID WORD”有效的话,就不用输出。 在任何一种情况下,输出一个包含六个星号的行来表示列表的结尾。
解题思路:
1、输出时要输出原字符串,所以必须建立数组1存储词典中的单词,单词按输入的存储,不能改变;
2、查找时由于是按字母查找对应单词,需要对每一个单词进行排序(递增递减无所谓),排序后的单词再次建一个数组2,排序后单词的下标要与词典中原单词对应的下标一致。
3、将输入要查找的单词进行排序,在数组2中找的相同元素的下标,然后根据此下标找到数组1中原单词地位置并打印,没有找到就打印“NOT A VALID WORD"。
代码实现:
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
string ss[100 + 1];
vector<string> v;
void Ans(const string& s, const int& len)
{
bool flg = false;
for (int i = 0; i < len; i++)
{
if (v[i] == s)
{
cout << ss[i] << endl;
flg = true;
}
}
if (!flg)
{
cout << "NOT A VALID WORD" << endl;
}
cout << "******" << endl;
}
int main()
{
int i = 0;
string s;
while (cin >> s)
{
if (s == "XXXXXX")
{
break;
}
ss[i++] = s;
sort(s.begin(), s.end());
v.push_back(s);
}
while (cin >> s)
{
if (s == "XXXXXX")
{
break;
}
sort(s.begin(), s.end());
Ans(s, i);
}
return 0;
}