模版输出/公式输出
一、分析
1. 模版输出/公式输出
在 CSP-J 竞赛中,模版输出一般很少出,但是公式输出非常容易放在第一题(江浙请跳过该章)。但是复习得多总比复习得少好吧😊
2. 题目难度
对于模版输出而言,一般比较简单,只要找到规律,不用存储,只用打表就可以啦;对于公式输出,只要掌握一丢丢的高等数学知识就能轻松通过啦。
二、例题
1. [COCI2006-2007#1] Okviri
题目描述
“彼得·潘框架”是一种装饰文字,每一个字母都是由一个菱形框架。一个彼得·潘框架看起来像这样 (x是字母,#是框架):
..#.. .#.#. #.X.# .#.#. ..#..
然而,只是一个框架会有些沉闷,所以我们每遇到三个字母会把第三个字母用温迪框架把它框起来。温迪框架看起来像这样:
..*.. .*.*. *.X.* .*.*. ..*..
当温迪和彼得·潘的框架重叠时,温迪框架覆盖在上面。 (见样例2和3)
输入格式
一行包含至多15个英文字母的大写字母。
输出格式
输出使用彼得·潘和温迪框架写成的5行文字。
样例1
输入
A
输出
..#.. .#.#. #.A.# .#.#. ..#..
样例2
输入
DOG
输出
..#...#...*.. .#.#.#.#.*.*. #.D.#.O.*.G.* .#.#.#.#.*.*. ..#...#...*..
样例3
输入
ABCD
输出
..#...#...*...#.. .#.#.#.#.*.*.#.#. #.A.#.B.*.C.*.D.# .#.#.#.#.*.*.#.#. ..#...#...*...#..
我们来一起找一找规律:
- 第一行:以四个字符为一组,是 3 3 3 的倍数组用温迪,否则用彼得潘。最后一个字符补上。
- 第二行:以四个字符为一组,是 3 3 3 的倍数组用温迪,否则用彼得潘。最后一个字符补上。
- 第三行:以四个字符为一组,是 3 3 3 的倍数或者不是第一重要并且模 3 3 3 为 1 1 1 用温迪,否则用彼得潘。最后一个字符如果是 3 3 3 的倍数用温迪,否则用彼得潘。
- 第四行:和第二行一样。
- 第五行:和第一行一样。
这种规律要数学很好,对对称、旋转十分敏感,当然也可以自己在草稿纸上分一分、画一画,这不就找出来了嘛。
#include <iostream>
#include <string>
using namespace std;
int n;
string s;
int main()
{
cin >> s;
n = s.length();
// line 1
for (int i = 1; i <= n; i++)
{
if (i % 3 == 0)
cout << "..*.";
else
cout << "..#.";
if (i == n)
cout << ".\n";
}
// line 2
for (int i = 1; i <= n; i++)
{
if (i % 3 == 0)
cout << ".*.*";
else
cout << ".#.#";
if (i == n)
cout << ".\n";
}
// line 3
for (int i = 1; i <= n; i++)
{
if (i % 3 == 0 || (i % 3 == 1 && i != 1))
cout << "*." << s[i-1] << ".";
else
cout << "#." << s[i-1] << ".";
if (i == n)
{
if (i % 3 == 0)
cout << "*\n";
else
cout << "#\n";
}
}
// line 4
for (int i = 1; i <= n; i++)
{
if (i % 3 == 0)
cout << ".*.*";
else
cout << ".#.#";
if (i == n)
cout << ".\n";
}
// line 5
for (int i = 1; i <= n; i++)
{
if (i % 3 == 0