Bailian2801 填詞 POJ1629 ZOJ1546 Fillword【排序】

2801:填詞
描述
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的題目

問題鏈接Bailian2801 填詞 POJ1629 ZOJ1546 Fillword
問題描述:(略)
問題分析
    這個問題題面寫的十分難懂,充滿陷阱(坑很多)。其實就是兩組單詞,用後一組去劃前一組的字母,剩下的字母就是神祕單詞。輸入都是大寫字母,題面似乎也沒有說清楚。
    輸出要求是按字典順序輸出,如果進行排序就比較麻煩了,所以用桶排序的思想,把兩組單詞中的字母分別進行一下計數(一個正計數,一個倒計數),然後按照字母順序輸出結果。
程序說明:(略)
參考鏈接:(略)
題記
    桶排序是最好用的排序,排序對象值範圍有限的話。

AC的C語言程序如下:

/* Bailian2801 填詞 POJ1629 ZOJ1546 Fillword */

#include <stdio.h>
#include <string.h>

#define N 26
#define M 10

int ccnt[N];
char s[M * M + 1];

int main(void)
{
    int n, m, p, i, j;

    while(~scanf("%d%d%d", &n, &m, &p)) {
        memset(ccnt, 0, sizeof(ccnt));

        for(i = 1; i <= n; i++) {
            scanf("%s", s);
            for(j = 0; s[j]; j++)
                ccnt[s[j] - 'A']++;
        }

        for(i = 1; i <= p; i++) {
            scanf("%s", s);
            for(j = 0; s[j]; j++)
                ccnt[s[j] - 'A']--;
        }

        /* 輸出結果 */
        for(i = 0; i < N; i++)
            if(ccnt[i])
                for(j = 1; j <= ccnt[i]; j++)
                    putchar('A' + i);
        putchar('\n');
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章