(四)王道机试指南___排版问题

算例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的时候,不去角!!!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值