输出图形

排版题:

第一类:规律性墙,自上而下,自左到右输出即可。

第二类:规律性无,先完成排版再输出!


第一类:


/*
排版题:
第一类:规律性墙,自上而下,自左到右输出即可。
第二类:规律性无,先完成排版再输出!

题目:

输入一个高度h,输出一个高为h,上底边为h的梯形。

输入:
一个整数h(1<=h<=1000)。
输出:
h所对应的梯形。
样例输入:
4
样例输出:
      ****
    ******
  ********
**********

*/
#include <stdio.h>

int main()
{
	int h;
	while (scanf("%d", &h) != EOF){
		int lenBottom, cns, cnb;
		
		lenBottom = h + (h-1) * 2;
		cns = h;
		
		
		for( int i = 0; i < h; i++){
			cnb = lenBottom - cns; //空白符数
			for (int j=1; i <= cnb; j++)
				printf(" ");
			for (int j=1; i <= cns; j++)
				printf("*");
			cns += 2; // 下一行星的书目
		}
	
	}
	return 0;
}

第二类:

思想很重要:排版,输出!怎么排?怎么简单怎么排呗!
/*
排版题:
第一类:规律性墙,自上而下,自左到右输出即可。
第二类:规律性无,先完成排版再输出!


本题目为第二类!但是我还是不小心找到了规律,并且AC!

WA:
1、没有考虑每组之间有空格
2、n = 1,是特例
3、方案二中没有计算下一圈的参照坐标
*/


int max(int x, int y){
	return x > y ? x : y;
}

int Abs(int x){
	return x > 0 ? x : -x;
}

// 是否是边角,是用空格
int isSpace(int x, int y, int n){
	return (x == 0 && y == 0) || (x == 0 && y == n-1) ||
	(x == n-1 && y == 0) ||(x == n-1 && y == n-1);
}
#include <stdio.h>

int main (){
	#ifdef ONLINE_JUDGE
	#else
	freopen("E:\\in.txt","r",stdin);
	#endif
	
	int n; // n 为奇数
	char a, b;// a :中心图案
	char map[80][80]; 
	bool firstCase = true;
	
	while (scanf("%d %c %c", &n, &a, &b) != EOF){
		if (firstCase == true){
			firstCase = false;
		}else{
			printf("\n"); //多组数据之间的空格
		}
		
		if (n == 1){
			printf("a\n");
			continue;
		} // 特例
		
		int c = n / 2;// (c,c)为中心坐标
		for (int i = 0; i < n; i++){
			for (int j = 0; j < n; j ++){
			
				if(isSpace(i,j,n))
					printf(" ");
				else{
					int level = max(Abs(i-c), Abs(j-c)) % 2;
					if (level == 0)
						printf("%c", a);// 同中心
					else
						printf("%c", b);// 不同
				} // if-else
				
			}// for :内
			printf("\n");//一行输出完毕
		}// for:外
	}// while : zu
	
	return 0;
}

//--------------------  华丽丽的分割线  -------------------------------------
// 排版的方案:从内而外,左上角的坐标为参照
//

#include <stdio.h>

int main(){
	#ifdef ONLINE_JUDGE
	#else
	freopen("E:\\in.txt", "r", stdin);
	#endif
	
	int map[82][82];//char 也是可以的。左上角坐标为(1,1).右下角为(n,n)
	int n;
	char a, b;
	bool firstCase = true;
	
	while (scanf ("%d %c %c", &n, &a, &b) != EOF){
		if (firstCase == true){
			firstCase = false;
		}else{
			printf("\n"); //多组数据之间的空格
		}
		
		int o = n/2 + 1; // (o,o)为中心坐标
		int x, y; //每圈左上角的坐标
		x = o; // x向下增
		y = o; // y向右增
		
		for (int len = 1, j = 1; len <= n; len +=2, j++){ // j代表圈号,最内为1,len代表圈的边长,以2递增
			char c = (j%2) == 1 ? a : b; //本圈的图案
			
			for (int k=0; k < len; k++){
				map[x][y+k] = c; //up
				map[x+len-1][y+k] = c; //bottom
				map[x+k][y]= c; // left
				map[x+k][y+len-1]= c; // right
				
			} // 填充本圈
			
			if (n != 1){
				map[1][1] = ' ';
				map[1][n] = ' ';
				map[n][1] = ' ';
				map[n][n] = ' ';
			}// n != 1, 四角为空
			
			x--;
			y--; //下一圈的参照坐标
		}// for: 每圈处理
	
		for (int i = 1; i <= n; i++){
			for(int j =1; j <= n; j++)
				printf("%c", map[i][j]);
			printf("\n");
		}
	
	} // while
	

	return 0;
}





















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值