题解 P4327 【[COCI2006-2007#1] Okviri】
c++代码
比较水的模拟题,不过我也写了好久,最后发现只是数组开小了,改掉就对了。。。
下面是解析:
这题先把储存的数组全赋值为‘ . ’再求长度(因为宽度恒为5,不用求),长度等于5倍的字母个数减去字母个数最后加一,求出长度后,求第一个字母的位置,易得为3,之后每个位置都要加4,再根据每个字母的位置写出周围的符号,注意,这里有一个特判,若空间已被‘ * ’占掉,则什么也不干,最后输出即可
#include <bits/stdc++.h>//万能头,好东西
using namespace std;
int len,lena,ll=3,aa;//ll为第一个字母的初始位置
char a[20],b[1000][100],c;
int main(){
cin>>a;//输入初始字符串
len=strlen(a);//求出字符串长度,strlen()函数能求出字符串长度
lena=4*len+1;//求出输出字符矩阵的长度,宽度恒为五
memset(b,'.',sizeof(b));//将b数组全赋值为‘.’,以便后来使用
while(ll<=lena){//开始循环
aa++;//到第aa个字母
if(aa%3==0)c='*';
else c='#';//若为3的倍数个,则用‘*’
b[3][ll]=a[aa-1];//把字母填入b数组中
b[1][ll]=c;
b[5][ll]=c;
b[2][ll-1]=c;
b[2][ll+1]=c;
b[4][ll-1]=c;
b[4][ll+1]=c;//根据字母的位置推出其他字符的位置,并填入b数组中
if(b[3][ll-2]!='*')b[3][ll-2]=c;
if(b[3][ll+2]!='*')b[3][ll+2]=c;//特判,若以被‘*’覆盖,则不能被‘#’覆盖
ll+=4;//之后每个字母的为止为前一个加4
}
for(int i=1;i<=5;i++){
for(int j=1;j<=lena;j++)
cout<<b[i][j];//输出
cout<<endl;//不要忘了每行要加回车
}
return 0;//end
}
//wdcxz