PTA 剥洋葱(超级好理解)

题目描述:

布告,布告! 应老师要求,我们要做一道打印图形的题目,这是程序员最基本的能力。 那废话不多说,我们来说要求的图形 AAAAA ABBBA ABCBA ABBBA AAAAA 就是外到内,从A到Z。每一层都是一种字母,最里面的一层为一个,即最中心的一个。

输入格式:

一行,一个整数,即图形的层数

输出格式:

如上述图形

输入样例:

3

输出样例:

AAAAA
ABBBA
ABCBA
ABBBA
AAAAA

思路分析:

  1. 根据输入计算图形的行数和列数,创建一个二维数组。
  2. 由题可知,从外层往内层,字母逐层增加(从A >> Z)。
  3. 不妨通过两个for循环(i ,j)进行数组下标移动,先用字母A把最外一层数组元素覆盖。假设i,j初始值均为1,则最大值分别为m(2*n-1),所以在数组中,当条件为(i == 1 || j == 1 || i == m || j == m)均为A,以此类推。

代码:

#include <stdio.h>
int main()
{
	int stat, i, j, n, m;
	scanf("%d", &n);
	m = 2 * n - 1;
	int k = 1, z = m;
	char ch = 'A';
	char a[m+1][m+1]; //为了过程方便,这里把数组下标为0的空间浪费掉,数组从1开始,空间大小为m+1。
	for(stat = 0; stat < 26; stat++) //这个循环是控制字母依次增大,stat值可以更大,只不过当stat大于字母数后,ch值会继续自加,不止为Z。
	{
		for(i = k; i <= z; i++) //i的初始值为k,最大值为z,对比图形可以看出,循环的范围在逐渐减小,即外层保留覆盖,内层字母增大继续往里覆盖。j同理。
			for(j = k; j <= z; j++)
				if(i == k || j == k || i == z || j == z)
					a[i][j] = ch;
		if(k == m) break; //这里break掉的是控制字母的循环,当k == m时,整个图形的数组已经被字母全部覆盖掉。
		k++; //k控制覆盖从左上角向中间进行,对应的是上行和左列。
		z--;  //z控制覆盖从右下角向中间进行,对应的是下行和右列。
		ch += 1;
	}
	for(i = 1; i <= m; i++) //将数列输出。
	{
		for(j = 1; j <= m; j++)
			printf("%c", a[i][j]);
		printf("\n");
	}
	return 0;	
}

实操示例:

输入26时输出截图

发布了2 篇原创文章 · 获赞 2 · 访问量 59

猜你喜欢

转载自blog.csdn.net/jenny_jack/article/details/104414872
PTA
今日推荐