nuoyanli会打印图形

21 篇文章 0 订阅

题目链接:

https://nuoyanli.com/contest/19/problem/D

题面:

在这里插入图片描述
对于打印图形的题,使用平面几何知识也是很简单的;
对于两个for循环而言;
在这里插入图片描述
相当于建立一个a-b的坐标系;只不过是a向下,b向右;
在这里插入图片描述
然后可以利用直线方程来确定点的位置;
这里要注意的是打印图形时从a轴b轴上开始
所以对于可以发现第一行的点的坐标应该是a=0;b=3;
在这里插入图片描述
对于图形言点为第一排第四个,但是a轴b轴从零开始计算
而且会占据一个位置所以a、b坐标都要减一。
由于对于代码框而言并没有建系一说;
所以可以换一种方式理解先用空格铺满所用空间再在空间中建立系;为了表示清楚在这里我使用1来代替空格
在这里插入图片描述
比如这样 便建立了一个5-5的坐标系
然后我们的任务便是在图中进行图形的勾画;
对于本题而言,首先要观察规律,确定建系的大小,由于题目为打印与n有关的图形所以对于不同的n而言所建系的大小也不同;由于1的特殊性 无法观察 所以1先放过去;从2开始寻找规律;可以数一下图形的长宽高来寻找一个数列表达出规律;
2:左右7, 上下5
3:左右13,上下9
4:左右19,上下13

简单的数列问题:左右=6*n-5 上下=4*n-3
然后便可以先用空格铺出我们所需要的坐标系
由于题目为多组输出,所以自然要带上while,这里以2为例
在这里插入图片描述
系建好之后便要在系中画出我们所需要的图形来
这时候一般通过直线方程来实现
再次观察图形可以发现六芒星由6条直线构成
我们便要将6条直线画出 来构成图形
再次观察可以发现两条直线为一点一空较为复杂
所以先做4条斜线
直接使用a,b的系来计算每条直线数出两个点,用a=xb+c;
x与c为未知量来计算直线方程
对于对于不同的n图形不同 所以我们还要找规律来表达:
在这里插入图片描述
先做左直线
2:a=-b+3 记得算点时由于带a,b轴
3:a=-b+6 所以化为坐标都要减一
4: a=-b+9
a=-b+3(n-1)=3*n-3-b* 所以第一条直线便写出了
然后同理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
书写时要用“||” (或) 来写因为是直线成立即可都要打印有些限定条件较多会使用“&&”(且)来做限定;
当然在做完这些之后我们会发现其实跟想象的图形不同
那是由于未对空格做出区域限定;之前的直线方程已经写出
所以此时直接使用 在直线内再铺满空格:
在这里插入图片描述
一般做题最好一个点一个空格写出 这样可以保证图形不会变形更好去调整点的位置
在这里插入图片描述
在这里插入图片描述
可以发现基本图形出现了接下来便是将两条直线补上,再次观察图像可以发现 对于直线而言 一点一空格,然后我们可以发现当b的点是偶数时有点而奇数时是空格
(对于第一点以及最后一点不用考虑 之前代码已经打出这里只需要补上空缺)
然后同样的找规律
在这里插入图片描述
在这里在直线上做偶数限定便要使用&&来完成
但由于与之前不冲突所以||隔开就好
在这里插入图片描述
在这里插入图片描述
这时候可以发现 六芒星基本完成了
但是空格的位置有多出来的需要对空格再次进行限定
将右下角及右上角的空格去掉 还是用区域限定
我使用的方法是对于多出部分再用一个if语句来限定输出
但是不输出任何东西 这样会将这一区域从输出空格的
else if中剔除
在这里插入图片描述
然后就可以看成品了
在这里插入图片描述
把1再换回空格
在这里插入图片描述
nuoyanli的六芒形变完成了

完整代码:

在这里插入图片描述

#include<stdio.h>
int main()
{
	int a,b;
	int n;
	while(~scanf("%d",&n))
	{
		for(a=0;a<(4*n-3);a++)
		{
			for(b=0;b<(6*n-5);b++)
			{
				if((a==(3*n-3-b))||(a==(b-3*n+3))||(a==(b+n-1))||(a==(7*n-7-b))||(a==n-1)&&(b%2==0)||(a==3*n-3)&&(b%2==0))printf("*");
				else if((a>(3*n-3))&&(a>(7*n-7-b))||(a<n-1)&&(a<(b-3*n+3)))continue;
				else if((a>(3*n-3-b))&&(a>(b-3*n+3))||(a>(b-3*n+3))&&(a<=(3*n-1))||(a<(7*n-7-b)))printf(" ");
			}printf("\n");
		}
		printf("\n");
	}
	return 0;
}

感谢王启宇为我们提供详细的题解,至于for一行一行暴力找规律的代码就不贴出来了,有问题可以找王启宇解答(qq:778321906。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuoyanli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值