- 时间限制: 1000m 内存限制: 65536kB
- 描述
- Alex喜欢填词游戏。填词是游戏是一个非常简单的游戏。填词游戏包括一个N * M大小的矩形方格盘和P个单词。玩家需要把每个方格中填上一个字母使得每个单词都能在方格盘上找到。每个单词都能找到要满足下面的条件:
每个方格都不能同时属于超过一个的单词。一个长为k的单词一定要占据k个方格。单词在方格盘中出现的方向只能是竖直的或者水平的。
你的任务是首先在方格盘上找到所有的单词,当然在棋盘上可能有些方格没有被单词占据。然后把这些没有用的方格找出来,把这些方格上的字母按照字典序组成一个“神秘单词”。
如果你还不了解规则,我们可以具一个例子,比如在下图中寻找单词BEG和GEE。
-
-
- 输入
- 输入的第一行包括三个整数N,M和P (2 <= M, N <= 10, 0 <= P <=100)。接下来的N行,每行包括M个字符,来表示方格盘。接下来P行给出需要在方格盘中找到的单词。
输入保证填词游戏至少有一组答案。
输入中给出的字母都是大写字母。 - 输出
- 输出“神秘单词”,注意“神秘单词”中的字母要按照字典序给出。
- 样例输入
-
3 3 2EBGGEEEGEBEGGEE
- 样例输出
-
EEG
(1)、源代码:
#include<stdio.h>
#include<string.h>
int main()
{
int ch[26];
memset(ch,0,sizeof(ch));
int i,n,m,p;
char str[200];
char c;
scanf("%d%d%d",&n,&m,&p);
while(n--){ scanf("%s",str);
for(i=0;str[i]!='\0';i++)
ch[str[i]-'A']++; }
while(p--){
scanf("%s",str);
for(i=0;str[i]!='\0';i++)
ch[str[i]-'A']--;
}
for(i=0;i<26;i++){
if(ch[i]!=0)
while(ch[i]--){
c='A'+i;
printf("%c",c);
}
}
return 0;
}
(2)、解题思路
这道题的巧妙之处在于输入保证填词游戏至少有一组答案——这说明我们不必寻找单词所在的位置,只要去掉这些单词所占用的字母就可以了。“神秘单词”按字典序给出,则只要定义一个有26个元素的数组,记录每个字母出现的次数,当读入单词时,相应字母的元素值减一即可。最后将数组中非0的元素对应字母一次输出。
(3)、出错原因:
a、对题目理解不透彻,移位要找出单词的填法;
b、未知:我的C++版代码如下,总是wrong answer,不知原因,求解释:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int main()
{
int M, N, P;
cin >> M >> N >> P;
char c;
int i, j;
int num[26];
memset(num, 0, sizeof(num));
for(i = 0; i < N; i++)
{
string word;
cin >> word;
for(j = 0; word[j] != '\0'; j++)
num[word[j] - 'A']++;
}
for(i = 0; i < P; i++)
{
string word;
cin >> word;
for(j = 0; word[j] != '\0'; j++)
num[word[j]-'A']--;
}
for(i = 0; i < 26; i++)
{
if(num[i] != 0)
for(j = 0; j < num[i]; j++)
{
c = 'A' + i;
cout << c;
}
}
return 0;
}