1、图形排版
图形排版是最为常见的模拟类题型,这类题目要求考生按照特定规则输出字符,主要考查
考生对输出格式的把握。通常来说这类题目的规律性比较强,掌握了题目中的规律,题目便能
迎刃而解。
一般思路(二维数组+列出循环规律)
1)申请二维数组(固定大小,放在全局变量的位置) 2)根据条件,从任意方向开始设置二维数组; 3)把图案的每一行的边界的后一个位置使用'\0' 赋值; 4)使用printf和 %s 配合循环打印每一行
输出梯形(清华大学复试上机题)
题目描述:
输入一个高度 h,输出一个高度为 h、上底边长度为 h 的梯形。
输入: 一个整数 h
(
1 <=
h <=
1000
)。
输出:
h
所对应的梯形。
样例输入:
4
样例输出:
****
******
********
**********
思路:循环—对于循环内语句写一些找找规律 空格 和 * 来用h表示;
![](https://i-blog.csdnimg.cn/blog_migrate/537c4b3c5c97b4b37c37619f4c493870.jpeg)
代码表示:
#include<bits/stdc++.h>
using namespace std;
//要用while循环实现不确定的输入
int main()
{
int h;
//scanf返回值是整数:1.返回读取内容个数 %d 2.EOF文件终止符
while(scanf("%d",&h)!=EOF)//while配合scanf
{
for(int i=0;i<h;++i){//第一列
for(int j=0;j<2*h-2-2*i;++j){//空格
printf(" ");}
for(int j=0;j<h+2*i;++j){//连着上面打印*
printf("*");
}
printf("\n");
}
}
}
补充:
使用二维数组处理图案模拟问题
补充二维数组代码:
#include <bits/stdc++.h>
using namespace std;
// 定义全局数组,申请较大的空间
char arr[1000][3000];
int main() {
int h;
while (scanf("%d", &h) != EOF) {
// 将区域都填上空格
for (int i = 0; i < h; ++i) {
for (int j = 0; j < 3 * h - 2; ++j) {
arr[i][j] = ' ';
}
}
// 填充梯形区域
int beg=0;//注意作用域问题
//最后一行下标是 h-1,注意他是从0开始的
for (int i = h - 1; i >= 0; --i) {
//int beg = 0;
for (int j = beg; j < 3 * h - 2; ++j) {
arr[i][j] = '*';
}
beg = beg + 2; // 起始下标每次加2
}
// 输出梯形区域
for (int i = 0; i < h; ++i) {
for (int j = 0; j < 3 * h - 2; ++j) {
printf("%c", arr[i][j]);
}
printf("\n");
}
}
return 0;
}
叠筐【难】
题目描述:
把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机
来完成,得看你的了。
输入: 输入是一个个三元组,分别是:外筐尺寸 n
(
n
为满足
0 <
n
< 80
的奇整数),中心花色字符,外筐花色字符,后二者都为 ASCII
可见字符。
输出: 输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角 总是被打磨掉。叠筐与叠筐之间应有一行间隔。
样例输入:
11 B A
5 @ W
样例输出:
AAAAAAAAA
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
AAAAAAAAA
@@@
@WWW@
@W@W@
@WWW@
@@@
思路体会
1.scanf %d 会忽略空白字符,scanf %c可以读取空白字符,scanf %c 如果前面有空格,则忽略空白字符
代码表示:
#include <iostream>
using namespace std;
int main() {
int n; // 外框长度
char inner, outter; // 里外即内和外的花色
bool flag = false; // 用于判断是否为第一行
while (scanf("%d %c %c", &n, &inner, &outter) != EOF) {
if (flag) {
cout << endl; // 输出空行
} else {
flag = true;
}
char pattern[80][80] = {0};
int x = n / 2; // 第一个点的横坐标
int y = n / 2; // 第一个点的纵坐标
char curChar = inner;
for (int length = 1; length <= n; length += 2, x--, y--) {
// x和y是起点的下标
for (int i = x, j = y; i < y + length; ++i) {
pattern[i][j] = curChar;
}
for (int i = x, j = y; j < y + length; ++j) {
pattern[i][j] = curChar;
}
for (int i = x + length - 1, j = y; j < y + length; ++j) {
pattern[i][j] = curChar;
}
for (int i = x, j = y + length - 1; i < x + length; ++i) {
pattern[i][j] = curChar;
}
if (curChar == inner) {
curChar = outter;
} else {
curChar = inner;
}
}
// 多框时需要抹掉四个角
if (n != 1) {
pattern[0][0] = ' ';
pattern[0][n - 1] = ' ';
pattern[n - 1][0] = ' ';
pattern[n - 1][n - 1] = ' ';
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << pattern[i][j];
}
cout << endl;
}
}
return 0;
}