算例1
-
问题描述
-
解题思路
①排版规律和输入输出规律相同(从左到右,从上到下),按规律输出即可
-
解题代码
#include <stdio.h>
int main() {
int h;
while (scanf("%d", &h) != EOF) {
int maxLine = h + (h - 1) * 2; //计算最后一行包含的星号个数
for (int i = 1; i <= h;i++) { //依次输出每行信息
for (int j = 1; j <= maxLine;j++) { //依次输出每行当中的空格或星号
if (j < maxLine - h - (i - 1) * 2 + 1)
printf(" ");
//输出空格
else //输出星号
printf("*");
}
printf("\n"); //输出换行
}
}
return 0;
}
-
注意点
①注意题目中给出的最终结果,不要按自己想的来
算例2
-
题目描述
-
解题思路
①由于题目实例的规律是一环环来的,和我们输出(从左到右,从上到下)的习惯不同,因此,这类题采用先排版后输出的思想
-
解题代码
//自己写的
#include <stdio.h>
int main() {
int buf[82][82];
char a, b;//内圈,外圈
int n;
while (scanf("%d%1s%1s", &n, &a, &b) != EOF) {
//从里到外输出圈
int zt = 1;//内圈
buf[n / 2][n / 2] = zt;
int x = n / 2 - 1;
int y = x;
for (int i = 1;i <= n / 2;i++) {
zt = zt == 1 ? 2 : 1;
for (int j = 0;j < 2 * i + 1;j++) {
buf[x][y + j] = zt;//上
buf[x + 2 * i][y + j] = zt;//下
buf[x + j][y] = zt;//左
buf[x + j][y + 2 * i] = zt;//右
}
//更新xy
x -= 1;
y -= 1;
}
//去角(1的时候例外)
if (n != 1) {
buf[0][0] = 0;
buf[n - 1][n - 1] = 0;
buf[0][n - 1] = 0;
buf[n - 1][0] = 0;
}
for (int i = 0;i < n;i++) {
if (i == 0)//控制隔行输出
printf("\n");
for (int j = 0;j < n;j++) {
switch (buf[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("%c", a);
break;
case 2:
printf("%c", b);
break;
}
}
printf("\n");
}
}
return 0;
}
-
注意点
①起初尝试按行输出,太麻烦了,所以一定要注重规律
②定义数组的时候,有已知大小的直接设出来就好了,不用动态数组
③在接收的时候,发现问题并解决:scanf %c 遇到空格结束,每次一个字符;scanf %s 遇到空格/回车结束。而这里可以用%1s控制每次读取的字符个数(虽然最终都只取1个字符赋值,但读取的时候不一样啊)
④switch千万别忘记break,不然执行case之后的所有case都会执行
⑤注意题目要求的隔行输出!!
⑥加分项:考虑n=1的时候,不去角!!!