您的位置:首页 > 编程语言 > C语言/C++

百练2801:填词

2016-03-04 16:30 246 查看
总时间限制: 1000ms 内存限制: 65536kB

描述

Alex喜欢填词游戏。填词是游戏是一个非常简单的游戏。填词游戏包括一个N * M大小的矩形方格盘和P个单词。玩家需要把每个方格中填上一个字母使得每个单词都能在方格盘上找到。每个单词都能找到要满足下面的条件:

每个方格都不能同时属于超过一个的单词。一个长为k的单词一定要占据k个方格。单词在方格盘中出现的方向只能是竖直的或者水平的。

你的任务是首先在方格盘上找到所有的单词,当然在棋盘上可能有些方格没有被单词占据。然后把这些没有用的方格找出来,把这些方格上的字母按照字典序组成一个“神秘单词”。

如果你还不了解规则,我们可以具一个例子,比如在下图中寻找单词BEG和GEE。



输入

输入的第一行包括三个整数N,M和P (2 <= M, N <= 10, 0 <= P <=100)。接下来的N行,每行包括M个字符,来表示方格盘。接下来P行给出需要在方格盘中找到的单词。

输入保证填词游戏至少有一组答案。

输入中给出的字母都是大写字母。

输出

输出“神秘单词”,注意“神秘单词”中的字母要按照字典序给出。

样例输入

3 3 2

EBG

GEE

EGE

BEG

GEE

样例输出

EEG

来源

翻译自Northeastern Europe 2001, Northern Subregion的题目

代码如下:

#include<stdio.h>
#define MAX_SIZE 26
int main(){
int N, M, P;
int i, j;
int table[MAX_SIZE];//统计每个单词出现的次数
while(scanf("%d%d%d", &N, &M, &P)!=EOF){
for(i=0; i <MAX_SIZE; i++){//把A-Z出现的次数重置为0
table[i]=0;
}
for(i=0; i <N; i++){//输入N行单词
char *word=new char[11];
scanf("%s", word);//输入单词
for(j=0; word[j] !='\0'; j++){
table[word[j]-'A']++;//对应的字母统计量增1
}
}
for(i=0; i <P; i++){
char *s_word=new char[201];//要查找的单词
scanf("%s", s_word);
for(j=0; word[j] !='\0'; j++){
table[s_word[j]-'A']--;//对应的字母统计量减1
}
}
for(i=0; i <MAX_SIZE; i++){
if(table[i]!=0){
for(j=0; j<table[i]; j++)
{
printf("%c", 'A'+i);
}

}
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 c-c++ 上机