算法-排序-单词重组

题目描述

在美国数以百万计的报纸中,有一种单词游戏称为猜词。游戏的目标是猜谜,为了找出答案中缺少的字母,有必要对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;
}

​
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值