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 }
posted @ 2012-05-01 10:49  Seraph2012  阅读(167)  评论(0编辑  收藏  举报