NC204417. 四万像素五角星
描述
小w曰:不以规矩,不能成方圆。然而在记事本中用字符绘制出 一个视觉上的正五角星却并不容易,因为在字符显示时,宽和高往往成1:2的比例关系。如:一个字符可以占8个屏幕像素宽和16个屏幕像素高。
为了简化这个问题,我们假设计算机显示字符的宽度为1个单位,高度为2个单位,一个字符所占的面积为2个单位。
请你绘制出一个正立的实心正五角星,并输出一张矩形画布。矩形画布的长和宽由你来指定,但是要求不多于2000行,每行不多于2000个字符。你的正立的实心正五角星可以画在画布的任意位置,但是必须保证整个五角星都被画在画布上。画布上已经上色的点用”*”来表示,未上色的点用”.”来表示。对于你画的正五角星将交由特判程序判断,要求如下:
1、你的实心五角星不能有孤立在外面的像素点,例如下图是一个绘制好的正立实心五角星的一部分,红框所示位置左上方的像素被孤立,这种情况下特判程序将会认定你WA。
只要你绘制的"*"的周围8个格子之内有其他的“*”,我们就认为它们是联通在一起的。
2、你所绘制的五角星的总面积应大于40000(四万)个像素单位,我们认为一个'*'占两个像素单位,即长一个像素单位,宽两个像素单位,所以面积为1*2=2个像素单位。这意味着你输出的画布上应该至少含有20000(两万)个'*'。
3、特判程序将会判定五角星的五个角的角度是否正确,你将会获得±5°的精度误差,只要你五角星的角度在误差允许的范围内,就会判定为正确。
输入描述
(本题无输入)
输出描述
直接输出字符画布,画布的大小应不超过2000*2000个字符,画布中应该含有一个正立的实心五角星,该五角星可以不必在画布的正中央,但是务必不要超过画布的范围。画布中应该仅包含'.'或'*'且'*'的个数不少于。
示例1
输入:
(No input)
输出:
.............................*.............................. ............................***............................. ............................***............................. ...........................*****............................ ..........................*******........................... ..........................*******........................... .........................*********.......................... ........................***********......................... ........................***********......................... .......................*************........................ ...*****************************************************.... .....*************************************************...... ........*******************************************......... ...........*************************************............ ..............*******************************............... ................***************************................. ..................***********************................... ..................***********************................... .................*************************.................. .................*************************.................. ................*************.*************................. ...............***********.......***********................ ...............********.............********................ ..............******...................******............... .............*****.......................*****.............. .............**.............................**.............. ............................................................ ............................................................ ............................................................ ............................................................
说明:
C++14(g++5.4) 解法, 执行用时: 603ms, 内存消耗: 2404K, 提交时间: 2020-04-02 10:00:51
#include<bits/stdc++.h> using namespace std; int i,i0,n,m,x0; const double pi=acos(-1),d1=pi*(90+36)/180,d2=pi*72/180,d3=pi*(90-36)/180,d4=pi*72/180,d5=pi*90/180,d6=pi*18/180; bool chk(double y,double x) { x-=x0,y-=x0; x=-fabs(x); if(x==0)x-=0.00000001; double zeta=atan(y/x); while(zeta>d1)zeta-=d2; while(zeta<d3)zeta+=d4; zeta=fabs(d5-zeta); return sqrt(x*x+y*y)/(x0)<=sin(d6)/sin(d6+zeta); } int main() { int size=1000; x0=(1+size)/2; for(i=1;i<=size;i++) { for(i0=1;i0<=size*2;i0++)printf("%c",chk((double)i,(double)i0/2)?'*':'.'); printf("\n"); } return 0; }
C++(clang++11) 解法, 执行用时: 262ms, 内存消耗: 2220K, 提交时间: 2021-02-05 19:09:45
#include<bits/stdc++.h> using namespace std; int i,i0,n,m,x0; const double pi=acos(-1),d1=pi*(90+36)/180,d2=pi*72/180,d3=pi*(90-36)/180,d4=pi*72/180,d5=pi*90/180,d6=pi*18/180; bool chk(double y,double x) { x-=x0,y-=x0; x=-fabs(x); if(x==0)x-=0.00000001; double zeta=atan(y/x); while(zeta>d1)zeta-=d2; while(zeta<d3)zeta+=d4; zeta=fabs(d5-zeta); return sqrt(x*x+y*y)/(x0)<=sin(d6)/sin(d6+zeta); } int main() { int size=1000; x0=(1+size)/2; for(i=1;i<=size;i++) { for(i0=1;i0<=size*2;i0++)printf("%c",chk((double)i,(double)i0/2)?'*':'.'); printf("\n"); } return 0; }