题目链接:
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。