列表

详情


NC204417. 四万像素五角星

描述

小w曰:不以规矩,不能成方圆。然而在记事本中用字符绘制出 一个视觉上的正五角星却并不容易,因为在字符显示时,宽和高往往成1:2的比例关系。如:一个字符可以占8个屏幕像素宽和16个屏幕像素高。

为了简化这个问题,我们假设计算机显示字符的宽度为1个单位,高度为2个单位,一个字符所占的面积为2个单位

请你绘制出一个正立的实心正五角星,并输出一张矩形画布。矩形画布的长和宽由你来指定,但是要求不多于2000行,每行不多于2000个字符。你的正立的实心正五角星可以画在画布的任意位置,但是必须保证整个五角星都被画在画布上。画布上已经上色的点用”*”来表示,未上色的点用”.”来表示。对于你画的正五角星将交由特判程序判断,要求如下:

1、你的实心五角星不能有孤立在外面的像素点,例如下图是一个绘制好的正立实心五角星的一部分,红框所示位置左上方的像素被孤立,这种情况下特判程序将会认定你WA。

 

只要你绘制的"*"的周围8个格子之内有其他的“*”,我们就认为它们是联通在一起的。

2、你所绘制的五角星的总面积应大于40000(四万)个像素单位,我们认为一个'*'占两个像素单位,即长一个像素单位,宽两个像素单位,所以面积为1*2=2个像素单位。这意味着你输出的画布上应该至少含有20000(两万)个'*'。

3、特判程序将会判定五角星的五个角的角度是否正确,你将会获得±5°的精度误差,只要你五角星的角度在误差允许的范围内,就会判定为正确。

直接输出Output中的五角星并不能AC,只是给了你一个输出的样例格式。你绘制的五角星应该远比这个样例大。

输入描述

(本题无输入)

输出描述

直接输出字符画布,画布的大小应不超过2000*2000个字符,画布中应该含有一个正立的实心五角星,该五角星可以不必在画布的正中央,但是务必不要超过画布的范围。
画布中应该仅包含'.'或'*'且'*'的个数不少于

示例1

输入:

(No input)

输出:

.............................*..............................
............................***.............................
............................***.............................
...........................*****............................
..........................*******...........................
..........................*******...........................
.........................*********..........................
........................***********.........................
........................***********.........................
.......................*************........................
...*****************************************************....
.....*************************************************......
........*******************************************.........
...........*************************************............
..............*******************************...............
................***************************.................
..................***********************...................
..................***********************...................
.................*************************..................
.................*************************..................
................*************.*************.................
...............***********.......***********................
...............********.............********................
..............******...................******...............
.............*****.......................*****..............
.............**.............................**..............
............................................................
............................................................
............................................................
............................................................

说明:


网页样例中显示的字体并非等宽字体,请将样例赋值黏贴到记事本,并设置字体为:为Consolas、Courier New、新宋体或其他等宽字体,然后调节字号查看效果。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

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;
}

上一题