图形打印的题目想必大家都非常的熟悉,对于一些非常简单的经典题目(例如:打印正方形 、菱形、三角形等)应该都会写。我们今天就来总结一下图形打印的题目的解法。

简单题

  我们还是用例题来讲解思路,现在假设我们需要打印一个指定宽(width)高(height)的直角三角形:

示例

  这种比较简单的图形打印题目,我们直接从上向下打印即可。那么我们首先需要考虑的便是空格数量和行标的关系,假设行标从1开始。

  观察图形可以发现,一行可能存在两段空格,即左端起始空格和三角内部空格。我们设左端起始空格的数量为Li、三角内部空格数量为Ni

  我们不难得出下面两个式子:

Li = width - i

Ni = (i - 2) * 2 - 1 (2 < i < height)

  接下来只要在两段空格后面添加#就可以了。

复杂题

  但是对于一些题目比较复杂,可能当前行的内容与下面的行有关。比如下面这道题:

题目

旭旭双来了

  这种题有两种解法,第一种是找规律,找一个公式来判断这一行的内容应当是什么;第二种就是先“打印”一部分内容,然后再回过头来“打印”剩下的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//打印指定数量个空格
void printSpace(int value) {
for (int i = 0; i != value; ++i) putchar(' ');
}

int main() {
int n;
cin >> n;
int ch1 = 0, ch2 = (n - 1) % 26; //ch2即图形右上角第一个字母
n = (n >> 1) - 1;
//打印上半部分
for (int i = n; i != -1; --i) {
printSpace(n - i);
putchar(char(ch1 + 'A'));
ch1 = (ch1 + 1) % 26;
printSpace(i << 1);
printf("%c\n", char(ch2 + 'A'));
ch2 = (ch2 + 25) % 26;
}
//打印下半部分
for (int i = 0; i <= n; ++i) {
printSpace(n - i);
putchar(char(ch2 + 'A'));
ch2 = (ch2 + 25) % 26;
printSpace(i << 1);
printf("%c\n", char(ch1 + 'A'));
ch1 = (ch1 + 1) % 26;
}
return 0;
}

  我们应该怎么做到打印完后面的再回到前面继续打印呢?

  答案很简答,我们先把结果写入到字符串中,最后再向控制台输出就可以了。(当然使用windows.h里面的API应该也是可以的)

  这道题题干没有给出n的范围,所以用这种方法写很可能会内存超限(调用API的话没有内存超限的问题),就不给出代码了。


说了这么多,我们做一道例题巩固一下

等腰三角形

  本题目要求你输出一个由数字组成的等腰三角形。

  具体的步骤是:

  先用 1,2,3,… 的自然数拼一个足够长的串。 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。 比如,当三角形高度是 8 时:

样例

输入格式

  一个正整数n,表示三角形的高度。 (3 < n < 300)

输出格式

  输出,用数字填充的等腰三角形。

  为了便于测评,我们要求空格一律用“点”(.)代替。

  具体,可参照样例。

输入样例

8

输出样例

样例

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
string output[300];
string key = "1";
int numKey = 1;
int pos = 0;

//向目标字符串中写入数字
void pushElement(string& dist) {
if (pos == key.length()) {
++numKey;
pos = 0;
key = to_string(numKey);
}
dist.push_back(key[pos++]);
}

int main() {
int n;
cin >> n;
int endIndex = n - 1;
//打印左侧边
for (int line = 0; line != endIndex; ++line) {
int space = n - line - 1;
output[line].insert(0, space, '.');
pushElement(output[line]);
}
//打印底边
int length = (n << 1) - 1;
for (int i = 0; i != length; ++i) pushElement(output[endIndex]);
//打印右侧边
for (int line = endIndex - 1; line != 0; --line) {
int space = ((line - 1) << 1) + 1;
output[line].insert(output[line].length(), space, '.');
pushElement(output[line]);
}
//输出
for (int i = 0; i != n; ++i) cout << output[i] << '\n';
return 0;
}

创作不易,扫描下方打赏二维码支持一下吧ヾ(≧▽≦*)o