排版题(1)

题目描述:

把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。

输入:

输入是一个个的三元组,分别是,外筐尺寸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@
 @@@
解题思路+源代码+注释---如下:
 
#include <stdio.h>


//本题的解决方法:先完成排版,再进行输出
//先将要输出的结果存储在二维数组中,再输出数组

char result[82][82];
int main()
{
	int firstLine = 1;
	int n;
	char a,b;

	//程序按照最内圈到最外圈的顺序来完成图形的排列
	//在完成每圈排列时要注意两点:首先需要确定该圈左上角的坐标
	//最中间圈的左上角字符坐标为(n/2+1,n/2+1),次中间圈的左上角字符坐标为(n/2+1-1,n/2+1-1),依次类推
	//                             其次需要计算该圈每边的边长
	//中心圈长度为1,次中心圈长度为3,依次类推
	//明确每圈用哪个字符填充,最中间圈用第一个字符,次中间圈用第二个字符,次次中间圈用第一个字符,依次周期循环。

	while(scanf("%d %c %c",&n,&a,&b) != EOF){
		if(firstLine != 1){  //处理题目中“叠框与叠框之间应有一行间隔”的要求
			printf("\n");    //除了在第一个叠框输出前不多输出一个空行外,在其他每一个叠框输出前都要额外输出一个空行
		}else{
			firstLine = 0;
		}
		
		int middle = (n/2)+1;//计算整个图形的中间行号
		int x = middle;      //x,y初始化为最中间圈左上角的坐标(事实上最中间圈也只占一个字符)
		int y = middle;
		for(int i =1,j = 1;j<=middle;j++,i = i+2){  //行数为n的图形,共有(n/2+1)圈,j是第几圈的计数器 i是第j圈(每圈都是正方形)的边长
			char temp = j%2==0?b:a;  //最中间圈--j为1--第一个字符---也就是说j为奇数是第一个字符,j为偶数是第二个字符
			x = middle-j+1;          //计算每圈左上角的坐标
			y = middle-j+1;
			for(int k =0;k <i;k++){  //填充每圈(每一圈只填充边界)
				if(k ==0 || k == i-1){  //若为该圈的第一行或最后一行---则都填满
					for(int t = 0;t <i;t++){   
						result[x+k][y+t]=temp;
					}
				}else{                  //若非该圈的第一行或最后一行---则只在该行的第一个和最后一个位置填上相应字符
					result[x+k][y]=temp;
					result[x+k][y+i-1]=temp;
				}
			}
		}
		if(n != 1){                     //在n大于1的情况下,每个输出图形最外圈的四个角为空
			result[1][1] = ' ';
			result[n][n] = ' ';
			result[1][n] = ' ';
			result[n][1] = ' ';
		}
		for(int i = 1;i <=n;i++){
			for(int j =1;j <=n;j++){
				printf("%c",result[i][j]);
			}
			printf("\n");
		}
	}
	return 0;
}

 

 

注明---该博客为本人王道的学习笔记记录,博客中有些总结是引用王道机试一书的。



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值