题目描述
C 市火车站最近出现了一种新式自动售票机。买票时,乘客要先在售票机上输入终点名称。一共有N 处:目的地,随着乘客按顺序输入终点名称的每个字母,候选终点站数目会逐渐减少。
在自动售票机屏幕上,有一个4 行8 列的键盘,如下图所示。

在乘客每输入一个字母后,键盘上只有有效字符是可选的(取决于还有哪些候选终点站),其余的字母会被字符'*' 取代。
告诉你N 处目的地的名称,以及乘客已经输入的若干字符,请你输出键盘目前的状态。
输入输出格式
输入格式:
第一行为一个整数N (1≤N ≤50)。接下来N 行,每行一个由大写英文字母组成的长度不超过100 的字符串,表示一处目的地。最后一行,一个长度不超过100 的字符串,表示按顺序输入的若干字符。
输出格式:
输出4 行,每行一个长度为8 的字符串,表示键盘状态。
输入样例#1:
4 ZAGREB SISAK ZADAR ZABOK ZA
输出样例#1:
****B*D* *G****** ******** ********
********
说明
【样例解释】
输入ZA 以后,下一个字符可能是G(终点站有可能是ZAGREB),或D(终点站有可能是ZADAR ),或B(终点站有可能是ZABOK )。
本人提供的题解
简单的模拟,注意,千万别开ios的那个同步,全WA
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<cstring>
using namespace std;
const int maxn(55);
string tmp[maxn];
string a[4]={
"***ABCDE",
"FGHIJKLM",
"NOPQRSTU",
"VWXYZ***",
};
bool vis[4][9]={0}; //标记
string temp;
inline void work(char);
inline void print(void);
int main(){
//ios::sync_with_stdio(false); 别开这个
int n;
scanf("%d",&n);
for(int i=0;i<n;++i){
cin>>tmp[i];
transform(tmp[i].begin(),tmp[i].end(),tmp[i].begin(),::toupper); //转换成大写
}
cin>>temp;
transform(temp.begin(),temp.end(),temp.begin(),::toupper);//转换成大写
int len=temp.length();
for(int i=0;i<n;++i){
string t=tmp[i].substr(0,len); //截取字符串
if(t!=temp) continue; //如果不相等的话就不进行判断
else {
char c=tmp[i][len];
work(c);
}
}
print();
return 0;
}
inline void work(char c){
for(int i=0;i<4;++i){
for(int j=0;j<8;++j){
if(a[i][j]==c){
vis[i][j]=1; //标记
break;
}
}
}
}
inline void print(void){
for(int i=0;i<4;++i){
for(int j=0;j<8;++j){
if(vis[i][j]==true) cout<<a[i][j]; //如果被标记就输出
else cout<<"*"; //否则输出*
}
cout<<endl; //换行
}
}
文章评论