hdu 1986

 地址:http://acm.hdu.edu.cn/showproblem.php?pid=1986

题意:按要求把字母或空格字符串扩展成5个01字符表示的字符串以后,缠绕放置在一个r*c的矩阵里。最后一排一排输出。

mark:各种wa。后来才发现是输入的问题。当字符串长度为0的时候,我本来用的是scanf的正则输入,结果事实证明不行。。。

另外用来放置扩展以后的字符串的字符数组ss一开始忘记清0也wa了一次。

代码:

 1 # include <stdio.h>
 2 # include <string.h>
 3 
 4 
 5 char str[100] ; // less than 80
 6 char ss[450] ; //less than 400
 7 char out[25][25] ;
 8 int vis[25][25] ;
 9 int r, c ;
10 
11 
12 void load(char *s, char ch)
13 {
14     int i, val ;
15     if (ch == ' ') val = 0 ;
16     else val = ch-'A'+1 ;
17     
18     for (i = 0 ; i < 5 ; i++)
19     {
20         if (val & (1<<i)) s[4-i] = '1' ;
21         else s[4-i] = '0' ;
22     }
23     s[5] = '\0' ;
24 }
25 
26 
27 void gao()
28 {
29     int x, y, d, i ;
30     int xx, yy ;
31     int tab[4][2] = {0,1,1,0,0,-1,-1,0} ;
32     memset(out, '0', sizeof(out)) ;
33     memset (vis, 0, sizeof(vis)) ;
34     x = y = d = 0 ;
35     for (i = 0 ; ss[i] ; i++)
36     {
37         out[x][y] = ss[i] ;
38         vis[x][y] = 1 ;
39         xx = x+tab[d][0], yy = y + tab[d][1] ;
40         if (vis[xx][yy] == 0 && xx >= 0 
41             && xx < r && yy >= 0 && yy < c) //不需要改变方向 
42         {
43             x = xx, y = yy ;
44         }
45         else
46         {
47             d = (d+1)%4 ;;
48             x += tab[d][0], y += tab[d][1] ;
49         }
50     }
51 }
52 
53 
54 int main ()
55 {
56     int  T, i, j, nCase = 1 ;
57 
58     scanf ("%d%*c", &T) ;
59     while (T--)
60     {
61         scanf ("%d%*c%d%*c", &r, &c) ;
62         gets (str) ;
63         ss[0] = '\0' ;
64         for (i = 0 ; str[i] ; i++)
65             load(ss+i*5, str[i]) ;
66         gao() ;
67         printf ("%d ", nCase++) ;
68         for (i = 0 ; i < r ; i++)
69             for (j = 0 ; j < c ; j++)
70                 putchar (out[i][j]) ;
71         puts ("") ;
72     }
73     return 0 ;
74 }

转载于:https://www.cnblogs.com/lzsz1212/archive/2012/04/27/2474345.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值