現在是打算開始好好學習學習算法了,前一陣自己實現了一些基礎的數據結構,雖說遞歸,分治什么一堆的基本算法還沒有怎么看,但是覺得很多簡單題不怎么用那些東西,所以打算找些做做。今兒就整了個填詞題,真是萬分打擊額,雖說自己也開發過不少小程序,敲過不少代碼,但是突然一下子就發現自己原來是一個大菜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.多從其他角度入手題目,不要總是順着想;
