Luogu P4327 【[COCI2006-2007 Contest1] Okviri】【题解】

题目描述

“彼得·潘框架”是一种装饰文字,每一个字母都是由一个菱形框架。一个彼得·潘框架看起来像这样 (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;//好习惯
}

猜你喜欢

转载自blog.csdn.net/weixin_44023181/article/details/84949398