题解 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