问题 F: 售票
时间限制: 1 Sec 内存限制: 128 MB
提交: 330 解决: 184
[提交] [状态] [讨论版] [命题人:admin]
题目描述
C 市火车站最近出现了一种新式自动售票机。买票时,乘客要先在售票机上 输入终点名称。一共有 N 处目的地,随着乘客按顺序输入终点名称的每个字母, 候选终点站数目会逐渐减少。
在自动售票机屏幕上,有一个 4 行 8 列的键盘,如下图所示。

在乘客每输入一个字母后,键盘上只有有效字符是可选的(取决于还有哪些 候选终点站),其余的字母会被字符 ’*’ 取代。
告诉你 N 处目的地的名称,以及乘客已经输入的若干字符,请你输出键盘目 前的状态。
输入
第一行为一个整数 N(1 ≤ N ≤ 50)。接下来 N 行,每行一个由大写英文字母 组成的长度不超过 100 的字符串,表示一处目的地。最后一行,一个长度不超过
100 的字符串,表示按顺序输入的若干字符。
输出
输出4行,每行一个长度为8的字符串,表示键盘状态。
样例输入
4 ZAGREB SISAK ZADAR ZABOK ZA
样例输出
****B*D* *G****** ******** ********
提示
输入 ZA 以后,下一个字符可能是 G(终点站有可能是 ZAGREB),或 D(终点 站有可能是 ZADAR),或 B(终点站有可能是 ZABOK)。
思路:比赛结束后,看了别人的题解,原来用strncmp就肥肠简单的提取了前缀相同的字符串了,真是一个很好用的工具啊.......然而咸鱼本鱼死磕了2个小时...最后还不知道改了哪里..突然AC,简直要哭泣。(这个代码下面还有比赛AC的代码)
strcnmp的基本操作:http://www.cplusplus.com/reference/cstring/strncmp/
代码:
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
char a[4][8]={'*','*','*','*','*','*','*','*',
'*','*','*','*','*','*','*','*',
'*','*','*','*','*','*','*','*',
'*','*','*','*','*','*','*','*'};
void print()
{
for(int i=0; i<4; i++)
{
for(int j=0; j<8; j++)
cout << a[i][j];
cout << endl;
}
}
void init()
{
for(int i=0; i<4; i++)
for(int j=0; j<8; j++)
a[i][j] = '*';
}
int main()
{
int n;
while(cin >> n)
{
init();
char str[55][105];
char str0[105];
for(int i=0; i<n; i++)
cin >> str[i];
cin >> str0;
for(int i=0; i<n; i++)
{
int len = strlen(str0);
if(strncmp(str[i],str0,len) == 0 && strlen(str[i])>len)
{
int x = (str[i][len]+4-'A')/8;
int y = (str[i][len]+4-'A')%8-1;
a[x][y] = str[i][len];
}
}
print();
}
return 0;
}
比赛AC代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<stdio.h>
#include<vector>
#include<map>
using namespace std;
char a[4][8] = {'*','*','*','*','*','*','*','*',
'*','*','*','*','*','*','*','*',
'*','*','*','*','*','*','*','*',
'*','*','*','*','*','*','*','*'
};
void print()
{
for(int i=0; i<4; i++)
{
for(int j=0; j<8; j++)
cout << a[i][j];
cout << endl;
}
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
vector<char> v[105];
string ch[55];
char key[105];
char ans[105];
for(int i=0; i<4; i++)
for(int j=0; j<8; j++)
a[i][j] = '*';
for(int i=0; i<n; i++)
cin >> ch[i];
scanf("%s",key);
sort(ch,ch+n);
// for(int i=0; i<n; i++)
// cout << ch[i] << endl;
for(int i=0; i<n; i++)
{
int flag0 = 0;
int len = ch[i].size();
for(int j=0; j<len; j++)
{
if(ch[i][j] != key[j] && j<strlen(key))
break;
if(ch[i][j] == key[j])
{
v[j].push_back(ch[i][j]);
flag0 = 1;
}
else
{
if(flag0)
v[j].push_back(ch[i][j]);
}
}
}
int len1 = strlen(key);
int flag = 0;
for(int i=0; i<len1; i++)
{
int len2 = v[i].size();
for(int j=0; j<len2; j++)
{
if(v[i][j] == key[i])
{
flag = 0;
break;
}
else
flag = 1;
}
}
for(int i=0; i<v[len1].size(); i++)
ans[i] = v[len1][i];
int l = strlen(ans);
if(flag == 0)
{
for(int i=0; i<l; i++)
{
int x = (ans[i]-'A'+4)/8;
int y = (ans[i]-'A'+4)%8-1;
a[x][y] = ans[i];
}
}
print();
}
return 0;
}
欢迎指正与交流
本文介绍了一种解决自动售票机键盘状态更新问题的算法,通过分析乘客输入的目的地前缀来确定键盘上哪些字母是可用的。文章提供了两种实现方案的代码示例,并解释了如何使用strncmp函数简化字符串匹配过程。

被折叠的 条评论
为什么被折叠?



