T9 Craziness(模拟)

题意:给出的一些已知字符串,在数字编码对应的情况下翻译给出的数字译码

思路:第一次尝试的时候,是想着如何把给出的数字译码翻译出来再进行一一对应比较,但是后来发现情况太多不好操作,采用逆向方法来进行操作更加的简单,将给出的字符串按照对应关系翻译成数字译码,在进行比较,不是一个很难的题

用到了stl中的stringsteam来进行字符串空格键的分割,很好使,不用跑循环

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<string,string> mp;
map<string,int> mp2;
vector<string> vt;

void solve(){
	int m;
//	cin>>m;
//	getchar();//需要2个getchar()来吸收空格 
//	getchar(); 
	scanf("%d\n",&m);
	int cnt=0;
	for(int i=1;i<=m;i++){
		vt.clear();
		string s;
		cnt++;
		int flag=1;
		ll ans=1;//记录可进行翻译所得的数目 
		getline(cin,s);
		stringstream ss(s);//通过使用stringsteam来根据字符串之间的空格进行分割字符串 
		while(ss>>s){//得到空格分开的单一字符串 
			if(mp.find(s)==mp.end()){//没有找到匹配的 
				flag=2;
				break; 
			} 
			else if(mp2[s]!=1){//找到了匹配的,但是数目不唯一,有多种可能 
				ans*=mp2[s];
				flag=3;
			}
			else{
				vt.push_back(mp[s]);
			} 
		}
		if(flag==2){
			printf("Message #%d: not a valid text\n",cnt);
			cout<<"\n";
		}
		else if(flag==3){
			printf("Message #%d: there are %d possible messages\n",cnt,ans);
			cout<<"\n";	
		}
		else if(flag==1){
			printf("Message #%d: ",cnt);
			for(int i=0;i<vt.size();i++){
				cout<<vt[i];
				if(i==vt.size()-1){
					cout<<endl;
				}
				else{
					cout<<" ";
				}
			}
			cout<<endl;
		}
	}
}


int main(){
	int n;
	cin>>n;
	string s;
	//在无法将给出的译码转换成字符串在进行匹配时,将已知的字符串转换成数字译码,在进行匹配
	//逆向解法 
	for(int i=1;i<=n;i++){
		cin>>s;
		string temp="";
		int len=s.size();
		for(int i=0;i<len;i++){
			if(s[i]=='a'||s[i]=='b'||s[i]=='c') temp+='2';
			if(s[i]=='d'||s[i]=='e'||s[i]=='f') temp+='3';
			if(s[i]=='g'||s[i]=='h'||s[i]=='i')	temp+='4';
			if(s[i]=='j'||s[i]=='k'||s[i]=='l')	temp+='5';
			if(s[i]=='m'||s[i]=='n'||s[i]=='o')	temp+='6';
			if(s[i]=='p'||s[i]=='q'||s[i]=='r'||s[i]=='s') temp+='7';
			if(s[i]=='t'||s[i]=='u'||s[i]=='v') temp+='8';
			if(s[i]=='w'||s[i]=='x'||s[i]=='y'||s[i]=='z') temp+='9';
		}
		mp[temp]=s;//重新存储给出的已知字符串 
		mp2[temp]++;//记录不同字符串对应的译码若有相同的,记录下数量 
	}
	solve(); 
	
	
	
	
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值