Luogu P4327 【[COCI2006-2007 Contest1] Okviri】【題解】
阿新 • • 發佈:2018-12-15
題目描述
“彼得·潘框架”是一種裝飾文字,每一個字母都是由一個菱形框架。一個彼得·潘框架看起來像這樣 (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;//好習慣
}