题目描述
“彼得·潘框架”是一种装饰文字,每一个字母都是由一个菱形框架。一个彼得·潘框架看起来像这样 (x是字母,#是框架):
..#..
.#.#.
#.X.#
.#.#.
..#..
然而,只是一个框架会有些沉闷,所以我们每遇到三个字母会把第三个字母用温迪框架把它框起来。温迪框架看起来像这样:
..*..
.*.*.
*.X.*
.*.*.
..*..
当温迪和彼得·潘的框架重叠时,温迪框架覆盖在上面。 (见样例3和4)
输入输出格式
输入格式:
一行包含至多15个英文字母的大写字母。
输出格式:
输出使用彼得·潘和温迪框架写成的5行文字。
输入输出样例
输入样例#1:
A
输出样例#1:
..#..
.#.#.
#.A.#
.#.#.
..#..
输入样例#2:
DOG
输出样例#2:
..#...#...*..
.#.#.#.#.*.*.
#.D.#.O.*.G.*
.#.#.#.#.*.*.
..#...#...*..
输入样例#3:
ABCD
输出样例#3:
..#...#...*...#..
.#.#.#.#.*.*.#.#.
#.A.#.B.*.C.*.D.#
.#.#.#.#.*.*.#.#.
..#...#...*...#..
题解
我做这道题的思想是拆分
把需要输出的基本分成四个一组
像这样:
..#. ..#. ..*. ..#..
.#.# .#.# .*.* .#.#.
#.X. #.X. *.X.* .X.#
.#.# .#.# .*.* .#.#.
..#. ..#. ..*. ..#..
注意:
第三部分第三行有五个字符,那么下一部分的第三行就少一个
输出的最后一部分也有五个字符
详见代码:
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define P1 printf("..#.")
#define P11 printf("..*.")
#define P2 printf(".#.#")
#define P22 printf(".*.*")
#define P3 printf("#.#")
#define P33 printf("*.*")//define一波好输出
using namespace std;
int n;
char s[20];
int main()
{
cin>>s+1;//从s+1开始输入比较好写
n=strlen(s+1);//所以长度也要从s+1开始
for(int i=1;i<=n;++i)//每四个一组输出
if(i%3) P1;//如果不能整除3,输出彼得·潘框架
else P11;//如果能整除,输出温迪框架
printf(".\n");//输出最后一个“.”
for(int i=1;i<=n;++i) if(i%3) P2;else P22;
printf(".\n");//与上同,不解释
//下面到本题的精华部分同时也是难点了
printf("#.%c.",s[1]);//先处理一下第一个
for(int i=2;i<=n;++i)//注意:这里i从2开始
{
if(i%3==1) printf(".%c.",s[i]);//如果是温迪框架之后的那一个,少输出一个字符
else if(i%3==2) printf("#.%c.",s[i]);
else printf("*.%c.*",s[i]);//如果能被3整除,输出温迪框架,记住是五个字符!
}
if(n%3) printf("#\n");//特判最后一个,如果最后一个框架不是温迪框架,输出“#”+回车
else printf("\n");//如果是,"*"已经输出过了,直接换行;
for(int i=1;i<=n;++i) if(i%3) P2;else P22;
printf(".\n");
for(int i=1;i<=n;++i) if(i%3) P1;else P11;
printf(".\n");
//输出后两行
return 0;//好习惯
}