XTU_OJ_1043 菱形Ⅰ

按照给定小菱形的数量n,利用字符打印菱形,要求

  1. 只使用/\,空格,回车四种字符。
  2. 行首无多余的空格,行末无空格。
  3. 菱形从上到下,从左到右,依次编码,从1到n,不要输出多余的菱形。
  4. 边长为a的大菱形,最少有(a−1)2+1个小菱形,最多有a2个小菱形。

具体格式见样例。

比如边长为3的菱形,最少有5个小菱形(左边的情况),最多有9个小菱形(右边的情况)。

   /\      /\
  /\/\    /\/\
 /\/\/   /\/\/\
 \/\/    \/\/\/
          \/\/
           \/

对应的编号分别为

  1     1
 2 3   2 3
4 5   4 5 6
       7 8
        9

输入格式

存在多个样例,每个样例是一个整数n(1≤n≤100)。如果n为0,表示输入结束,这个样例不需要处理。

输出格式

依次按要求输出对应数量的菱形。

样例输入

1
2
3
4
5
6
7
0

样例输出

/\
\/
 /\
/\/
\/
 /\
/\/\
\/\/
 /\
/\/\
\/\/
 \/
  /\
 /\/\
/\/\/
\/\/
  /\
 /\/\
/\/\/\
\/\/\/
  /\
 /\/\
/\/\/\
\/\/\/
 \/

代码:

#include<stdio.h>
#include<math.h>
int main(){
	int n = 1;
	while(n!=0){
		scanf("%d",&n);
		if(n==0) break;
		int a = ceil(sqrt((float)n));
		int head = a;
		int last = a;
		int count = 0;
		int up = (a*a-a)/2+a;
		
		
		for(int x = 0;x < a;x++){
			for(int y = 1;y < last||y == last;y++){
				if(y < head) printf(" ");
				else{
					if((y-head)%2==0){
						printf("/");
						printf("\\");
						count=count+1;
						if(count == n) break;
						y++;
					}
				}
			}
			head = head-1;
			last = last+1;
			if(x != a-1) printf("\n");
			
			if(x == a-1){
				if(count<up) printf("/");
				
				printf("\n");
				count = count-(a*a-a)/2;
				for(int z = 0;z < count*2;z++){
					printf("\\");
					printf("/");
					z++;
				}
			}
			
		}

if(n > up){
		printf("\n");
		count = up;
		for(int x = 0;x < a-1;x++){
			head = head+1;
			last = last-1;
			for(int y = 0;y<last;y++){
				if(y < head) printf(" ");
				else{
					if((y-head)%2 == 0){
						printf("\\");
						printf("/");
						count++;
						if(count == n) break;
						y++;
					}
				}
			}
			if(count == n) break;
			printf("\n");
		}
		
		
}
		printf("\n");
	}
	return 0;
}

运行结果:

思路:

于是再次进行题目分析:

        首先菱形可以分为上半部分up和下半部分down,经过计算,我们可以得到

        up=(a^2-a)/2+a

        down=(a^2-a)/2

        画菱形无非三种情况:

  1. 一种是画到上半部分的最后一层的中间,上层画不满:如N=5的情况;
  2. 上层刚好画满,如N=6;
  3. 画完上层还不够,画到下层,如N=7;

所以上层一定会画到最后一层,我们只需要把上层的最后一层根据最后一层所画的结点数去补一个/

——>如果是情况1则在最后补一个/,然后换行

——>如果是情况2则不需要补,直接换行

记录下最后一层所画的节点数count=count-(a^2-a)/2+a

换行之后,因为最后一层只缺\/了,画count个\/即可

至此为止,上半部分就画好了

下半部分我们经过分析,发现直接在节点处画\/即可

注意每好一个节点需判断画好的节点数是否等于n,等于则结束循环直接输出,不等于则下一步;

画节点的算法:

        1、将菱形分为上界和下界,上界a层,下界a-1层

        2、两层for循环:

                第一层for循环遍历层数

                第二层for遍历打印每一层的数据

                对每一层又根据第一个节点head和最后一个节点last划分区域

                当当前位置在head之前,打印空格,当当前位置与head的差值为2的倍数时,打印/\,计数点跳过\往前走一步;

                内层循环结束后换行;

                 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值