ACM_输出格式
输出格式
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
某水比参加了XX杯,但是他太水,所以三等都木有,所以他决定出一道水题水一水。
Input:
输入多组测试数据,每一组一个整数width(3-50),一个整数height(3-50),一个字符串(长度不超过width-2).
Output:
对于每个测试实例,要求把字符串按要求输出(字符串处于由width为长,height为宽的矩形的中部), (。。。倘若不能完全对称,请以左边比右边少,上边比下边少为原则如样例),具体格式请参照sample output。
Sample Input:
20 6 abcd1234 20 6 abc
Sample Output:
+------------------+ | | | abcd1234 | | | | | +------------------+ +------------------+ | | | abc | | | | | +------------------+
解题思路:水题!!!刚开始用了二维数组存放,代码比较简洁,但老是WA,原来是memset函数没有弄清楚,用0直接就填充字符二维数组,显然是不对的。。。本题所要填充的是字符空格' ',对应的ASCII码为32,因为memset函数将s所指向的某一块内存中的后n个字节的内容全部设置为ch指定的ASCII值,也可以直接用单个字符进行填充,明白这个后,以后做题思路就清晰了。
二维数组AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 char draw[55][55],s[50]; 4 int main(){ 5 int w,h,len,k,w0,h0; 6 while(cin>>w>>h>>s){ 7 memset(draw,' ',sizeof(draw)); 8 draw[0][0]=draw[0][w-1]=draw[h-1][0]=draw[h-1][w-1]='+'; 9 for(int j=1;j<w-1;++j) 10 draw[0][j]=draw[h-1][j]='-'; 11 for(int i=1;i<h-1;++i) 12 draw[i][0]=draw[i][w-1]='|'; 13 len=strlen(s);k=0;h0=(h-1)/2;w0=(w-len)/2; 14 for(int j=w0;k<len;++j) 15 draw[h0][j]=s[k++]; 16 for(int i=0;i<h;++i){ 17 for(int j=0;j<w;++j) 18 printf("%c",draw[i][j]); 19 printf("\n"); 20 } 21 } 22 return 0; 23 }
AC代码:
1 #include<bits/stdc++.h> 2 #define FOR(i,a,b) for (int i=a;i<=b;++i) 3 #define PTF printf 4 using namespace std; 5 int main(){ 6 int w,h,len,objh,objw;char s[50]; 7 while(cin>>w>>h>>s){ 8 len=strlen(s); 9 PTF("+"); 10 FOR(i,1,w-2)PTF("-"); 11 PTF("+\n"); 12 h-=2;h--;/*h减1是去掉包含字符串的那一行,接下来再平分行数*/objh=h/2; 13 FOR(i,1,objh){ 14 PTF("|"); 15 FOR(j,1,w-2)PTF(" "); 16 PTF("|\n"); 17 } 18 objw=(w-2-len)/2; 19 PTF("|"); 20 FOR(i,1,objw)PTF(" "); 21 PTF("%s",s);//直接输出字符串 22 FOR(i,1,w-2-len-objw)PTF(" "); 23 PTF("|\n"); 24 FOR(i,1,h-objh){ 25 PTF("|"); 26 FOR(j,1,w-2)PTF(" "); 27 PTF("|\n"); 28 } 29 PTF("+"); 30 FOR(i,1,w-2)PTF("-"); 31 PTF("+\n"); 32 } 33 return 0; 34 }