代码改变世界

【慢慢学算法】:填词游戏

2012-05-04 10:22  ATP_  阅读(2680)  评论(3编辑  收藏  举报

  现在是打算开始好好学习学习算法了,前一阵自己实现了一些基础的数据结构,虽说递归,分治什么一堆的基本算法还没有怎么看,但是觉得很多简单题不怎么用那些东西,所以打算找些做做。今儿就整了个填词题,真是万分打击额,虽说自己也开发过不少小程序,敲过不少代码,但是突然一下子就发现自己原来是一个大菜B啊!!唉,一定要发奋图强,好好练习了。本题可能对大神们来说特别简单,不过希望前辈们能给我提出一下学习建议神马的,跪谢了~

   先贴题目   

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
错误思路:
刚看到这个题,意思理解了老半天,有了一个思路:首先构建1个方格的类,包含标记使用次数的int n,记录坐标的x,y和存储字母的char c。然后从第一个字母找起,找到所有的字符串;最终读取出n==0的剩下字母并输出。真心是想起来容易做起来难啊,费了老大劲,最后还是放弃了,看了答案。。。。然后发现自己从头错到脚啊,完全被题目中“你的任务是首先在方格盘上找到所有的单词”这句话所误导,下面是看过解题思路后搞的。真心觉得算法之路任重而道远,还有很多事情需要我这个大菜鸟一点一点的去做。

正确思路:
  根本不用去找到每个字符串,因为输入给出的字符串是必然会找到的,所以说,我们的任务只是输出剩下的字母,因此,只需用一个整型数组character[26]来记录字母出现的次数并输出即可:

代码:
 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int N,M,P;
 8     int character[26];
 9     memset(character,0,sizeof(character));
10     cin >> N >> M >> P;
11     for(int i = 0; i < N; i++)
12     {
13     char str[11];
14     cin >> str;
15     for(int j = 0; str[j] != '\0'; j++)
16         character[str[j] - 'A']++;
17     }
18     for(int i = 0; i < P; i++)
19     {
20     char str[101];
21     cin >> str;
22     for(int j = 0; str[j] != '\0'; j++)
23         character[str[j] - 'A']--;
24     }
25     for(int i = 0; i < 26; i++)
26     {
27     if(character[i] != 0)
28         while(character[i]--)
29         cout << (char)(i + 'A');
30     }
31     return 0;
32 }

 

收获:1.理解题意很重要,不能被题目所误导;

      2.多从其他角度入手题目,不要总是顺着想;