1. 程式人生 > >Luogu P4327 【[COCI2006-2007 Contest1] Okviri】【題解】

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;//好習慣 }