2011-08-22 20:35:21Morris

b069. A. 千里傳情

b069. A. 千里傳情

內容 :

蜜蜂跟學妹很喜歡寫情書,在這資訊發達的時代,他們的情書當然不是傳統的輸信,而是用E-Mail傳送的。但蜜蜂很害羞,他不希望他的情書被駭客攔截,因此他決定把內容加密。他跟學妹發明了一種加密方法,他們要加密的文字只有大寫英文字母以及空白字元,首先將每個字元編號,空白編成0A編成1B編成2,…,Z編成26。再將編號轉為二進位後,以下圖的方式填入一個RxC的矩陣中:

 

0 → 0 → 0 → 1

0 → 1 → 0   0

           

0    0 ← 1   0

            

1 ← 0 ← 1 ← 0

 

B = 00010, E = 00101, E = 00101

 

結尾不夠的部分就直接補0,範例中R=4C=4,要編碼的字串為“BEE”,產生矩陣後,再一列一列的將數字接起來得到最後的編碼結果,因此“BEE”最後會得到的編碼字串是0001010000101010

 

輸入說明 :

輸入檔中會有多筆資料,第一行是一個正整數k,代表一共有多少組資料,接下來是k組測試資料,每組測試資料一行,格式如下:

 

R<空格>C<空格>由大寫字母及空格構成的字串

 

其中R不會超過20C不會超過20,且R*C不會小於五倍的字串長度

輸出說明 :

對每組測試資料,請輸出這是第幾組測試資料(1開始)以及編碼後的結果。

 

範例輸入 :

4
4 4 BEE
5 2 HI
2 6 HI
5 5 HI HO

範例輸出 :

1 0001010000101010
2 0110000010
3 010000001001
4 0100001000011010110000010

提示 :

* 題目敘述有誤,R 與 C 最大值為 21

出處 :

2007 NPSC 高中組初賽


作法 : 模擬
特別小心, 字串只有空白, 這點必須特別考慮,

/**********************************************************************************/
/*  Problem: b069 "A. 千里傳情" from 2007 NPSC 高中組初賽                */
/*  Language: C                                                                   */
/*  Result: AC (0ms, 242KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-08-22 20:31:24                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
void transform(int n, char *A) {
    if(n == 0) return;
    transform(n/2, A-1);
    *A = (n&1) + '0';
}
main() {
    int k, test = 0, R, C, a, b, c;
    char s[500], *A;
    scanf("%d", &k), getchar();
    while(k--) {
        gets(s);
        R = 0, C = 0;
        for(a = 0; s[a]; a++)
            if(s[a] >= '0' && s[a] <= '9')
                R = R*10 + s[a] - '0';
            else break;
        for(a++; s[a]; a++)
            if(s[a] >= '0' && s[a] <= '9')
                C = C*10 + s[a] - '0';
            else break;
        A = s+a+1;
        char TF[2002], Ans[201][201];
        for(a = R*C-1; a >= 0; a--)    TF[a] = '0';
        TF[R*C] = '\0';
        for(a = 0; A[a]; a++)    transform(A[a] == ' ' ? 0 : (A[a]-'A'+1), TF+(a+1)*5-1);
        int x = 0, y = 0, p = 0, L = R*C, tr = R, tc = C;
        for(a = 0; a < L; ) {
            switch(p) {
                case 0:{
                    for(b = 0; b < C; b++)
                        Ans[x][y++] = TF[a++];
                    y--, x++;
                    R--, p = 1;break;
                }
                case 1:{
                    for(b = 0; b < R; b++)
                        Ans[x++][y] = TF[a++];
                    y--, x--;
                    C--, p = 2;break;
                }
                case 2:{
                    for(b = 0; b < C; b++)
                        Ans[x][y--] = TF[a++];
                    y++, x--;
                    R--, p = 3;break;
                }
                case 3:{
                    for(b = 0; b < R; b++)
                        Ans[x--][y] = TF[a++];
                    y++, x++;
                    C--, p = 0;break;
                }
            }
        }
        printf("%d ", ++test);
        for(a = 0; a < tr; a++) {
            for(b = 0; b < tc; b++)
                printf("%c", Ans[a][b]);
        }
        puts("");
    }
    return 0;
}