b069. A. 千里傳情
b069. A. 千里傳情
內容 :
蜜蜂跟學妹很喜歡寫情書,在這資訊發達的時代,他們的情書當然不是傳統的輸信,而是用E-Mail傳送的。但蜜蜂很害羞,他不希望他的情書被駭客攔截,因此他決定把內容加密。他跟學妹發明了一種加密方法,他們要加密的文字只有大寫英文字母以及空白字元,首先將每個字元編號,空白編成0,A編成1,B編成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=4且C=4,要編碼的字串為“BEE”,產生矩陣後,再一列一列的將數字接起來得到最後的編碼結果,因此“BEE”最後會得到的編碼字串是0001010000101010
輸入說明
:
輸入檔中會有多筆資料,第一行是一個正整數k,代表一共有多少組資料,接下來是k組測試資料,每組測試資料一行,格式如下:
R<空格>C<空格>由大寫字母及空格構成的字串
其中R不會超過20,C不會超過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
提示
:
出處
:
作法 : 模擬
特別小心, 字串只有空白, 這點必須特別考慮,
/**********************************************************************************/
/* 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;
}
上一篇:b046. E. 智慧型單字查詢
下一篇:b043. B. 踩地雷回來了