hdu 1987
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1987
题意:就是1986的逆向。。。解码。
mark:要注意的是要去掉解码出来的字符串的结尾空格。如果字符串是空串,数字和字符串之间的空格不需要去掉。
一直PE,后来发现是去结尾空格的时候,i = len - 1写成了i = len。。。太2了。
代码:
1 # include <stdio.h> 2 # include <string.h> 3 4 5 char str[410] ; 6 char out[25][25] ; 7 char ss[100], ssout[110] ; 8 int r, c ; 9 10 11 void getstr() 12 { 13 int x , y , d ; 14 int xx, yy, i ; 15 int tab[4][2] = {0,1,1,0,0,-1,-1,0}; 16 x = y = d = 0 ; 17 for (i = 0 ; i < r*c ; i++) 18 { 19 str[i] = out[x][y] ; 20 out[x][y] = 0 ; 21 xx = x + tab[d][0], yy = y + tab[d][1] ; 22 if (xx < 0 || xx >= r || yy < 0 || yy >= c || out[xx][yy] == 0) 23 { 24 d = (d+1)%4 ; 25 x += tab[d][0], y += tab[d][1] ; 26 } 27 else x = xx, y = yy ; 28 } 29 } 30 31 32 int main () 33 { 34 int i, j, T, nCase = 1 ; 35 int val, len ; 36 int sslen ; 37 scanf ("%d", &T) ; 38 while (T--) 39 { 40 scanf ("%d %d%s", &r, &c, str) ; 41 for (i = 0 ; str[i] ; i++) 42 out[i/c][i%c] = str[i] ; 43 getstr() ; 44 len = r*c/5 * 5 ; 45 sslen = 0 ; 46 for (i =0 ; i < len ; i+=5) 47 { 48 val = 0 ; 49 for (j = 0 ; j < 5 ; j++) if (str[i+j] == '1') 50 val |= (1<<(4-j)) ; 51 if (val > 26) continue ; 52 if (val == 0) ss[sslen] = ' ' ; 53 else ss[sslen] = (val-1+'A') ; 54 ss [++sslen] = '\0' ; 55 } 56 for (i = sslen - 1; i >= 0 && ss[i] == ' ' ; i--) 57 ss[i] = '\0' ; 58 printf ("%d %s\n", nCase++, ss) ; 59 } 60 return 0 ; 61 }