杭电ACM 1113的三种方法

Word Amalgamation

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3491    Accepted Submission(s): 1707


Problem Description
In millions of newspapers across the United States there is a word game called Jumble. The object of this game is to solve a riddle, but in order to find the letters that appear in the answer it is necessary to unscramble four words. Your task is to write a program that can unscramble words.
 

Input
The input contains four parts:

1. a dictionary, which consists of at least one and at most 100 words, one per line;
2. a line containing XXXXXX, which signals the end of the dictionary;
3. one or more scrambled `words' that you must unscramble, each on a line by itself; and
4. another line containing XXXXXX, which signals the end of the file.

All words, including both dictionary words and scrambled words, consist only of lowercase English letters and will be at least one and at most six characters long. (Note that the sentinel XXXXXX contains uppercase X's.) The dictionary is not necessarily in sorted order, but each word in the dictionary is unique.
 

Output
For each scrambled word in the input, output an alphabetical list of all dictionary words that can be formed by rearranging the letters in the scrambled word. Each word in this list must appear on a line by itself. If the list is empty (because no dictionary words can be formed), output the line ``NOT A VALID WORD" instead. In either case, output a line containing six asterisks to signal the end of the list.
 

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 ******
 
看完题目后,对map容器熟悉的同学可能就会选择用map来做这道题目了,当然如果你对map不怎么了解你也可以选择用两个容器或结构体来解决这个问题。

解题思路:首先用map<string,string>一个string保存排序前的,另一个保存排序后的。接着 词典上各个排好序的单词与要找的单词(排序后的)比较,如果相同,则输出之前词典上还未排序的单词。倘若在词典上找不到相同的话输出NOT A VALID WORD。此题要注意题目要求的输出格式。

方法一 :运用map容器

#include<iostream>
#include<map>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
	string str,s,s1;
	bool flag;
	map<string,string> ma;
	map<string,string> ::iterator it;
	while(cin>>str && str != "XXXXXX")
	{
		s = str;
		sort(s.begin(),s.end());  
		ma.insert(pair<<span style="color:#cc0000;">string</span>,<span style="color:#ffcc00;">string</span>>(str,s));  //红色字体的用来存放排序前,黄色的用来保存排序后的
	}
	while(cin>>s1 && s1 != "XXXXXX")
	{
		flag = false;
		sort(s1.begin(),s1.end());
		for(it = ma.begin(); it != ma.end(); it++)
		{
			if(s1 == it->second) { flag = true;cout<<it->first<<endl; }
		}
		if(!flag){ cout<<"NOT A VALID WORD"<<endl; }
		cout<<"******"<<endl;
	}
	return 0;
}

方法二:使用两个容器

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
	string str,s;
	bool flag;
	vector<string> vec1,vec2;
	while(cin>>str && str != "XXXXXX")
	{
		vec1.push_back(str);     //排序前的str
		sort(str.begin(),str.end());		
		vec2.push_back(str);   //排序后的str

	}
	while(cin>>s && s != "XXXXXX")
	{
		flag = false;
		sort(s.begin(),s.end());
		for (int i = 0; i < vec2.size(); i++)
		{
			if(s == vec2[i]){ flag = true;cout<<vec1[i]<<endl; }
		}
		if(!flag){ cout<<"NOT A VALID WORD"<<endl;}
		cout<<"******"<<endl;
	}
	return 0;
}

方法三:使用结构体解决

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
struct MyStruct
{
	string str;  /<span style="font-family: Arial, Helvetica, sans-serif;">/用来保存排序前的str</span>
	string s;     /<span style="font-family: Arial, Helvetica, sans-serif;">/用来保存排序后的str</span><pre name="code" class="cpp">
};int main(){string str,s;int k = 0;bool flag;MyStruct mystruct[1000];while(cin>>str && str != "XXXXXX"){mystruct[k].str = str;sort(str.begin(),str.end());mystruct[k].s = str;k++;}while (cin>>s && s != "XXXXXX"){flag = false;sort(s.begin(),s.end());for (int i = 0; i < k; i++){if(s == mystruct[i].s){ flag = true;cout<<mystruct[i].str<<endl;}}if(!flag){ cout<<"NOT A VALID WORD"<<endl; }cout<<"******"<<endl;}return 0;}

 

注意:后面两种方式WA了,我看了蛮久也没有找到错误,也叫同学看了都觉得没错。如果你发现了错误告诉我一声噢!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]是一个关于有向图的强连通分量的算法模板,使用了深度优先搜索(DFS)来标记各个点的编号,并通过反向图进行第二遍DFS来找出连通分量。这个模板可以用来解决一些与有向图强连通分量相关的问题。 引用\[2\]是一个关于Dijkstra算法的模板,用于求解单源最短路径问题。它使用了优先队列来优化算法的时间复杂度,通过不断更新节点的最短路径长度来找到最短路径。 关于acm模板的整理和使用方法,可以按照以下步骤进行: 1. 首先,根据需要选择合适的算法模板,比如上述提到的强连通分量算法模板或Dijkstra算法模板。 2. 将选定的算法模板复制到你的代码中,并根据具体问题进行适当的修改和调整。 3. 确保你的代码中包含了所需的头文件和全局变量的定义。 4. 根据具体问题的输入格式,编写相应的输入代码,将输入数据存储到合适的数据结构中。 5. 调用选定的算法函数,传入合适的参数,进行计算。 6. 根据具体问题的输出格式,编写相应的输出代码,将计算结果输出。 7. 编译和运行你的代码,检查是否得到了正确的结果。 总结起来,整理和使用acm模板的方法包括选择合适的算法模板、修改和调整代码、编写输入和输出代码、调用算法函数进行计算、编译和运行代码。根据具体问题的要求,可以灵活地使用不同的算法模板来解决问题。 #### 引用[.reference_title] - *1* *2* [ACM 模板整理](https://blog.csdn.net/Lin_ZR/article/details/78976281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值