Problem
- 求轮廓线,图形由三角,圆,正方形拼成,三角为等边三角形。
Solution
- 大体框架还是找到最左边和最右边的方或圆(可以将轮廓线撑起来),然后算出两边三角包括三角与其他图形相连部分的轮廓线长度,然后算中间部分的轮廓线长度。
- 注意三角和圆轮廓线是与圆相切的。
Code
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double pai=3.14159265358979;
char s[25];
double ans;
int fir,last;
int main()
{
int n;
cin>>n;
getchar();
for(int i=1;i<=n;i++)
s[i]=getchar();
for(int i=1;i<=n;i++)
{
if(s[i]=='C'||s[i]=='S')
{
fir=i;
break;
}
}
for(int i=n;i>=1;i--)
{
if(s[i]=='C'||s[i]=='S')
{
last=i;
break;
}
}
if(n==1)
{
if(s[1]=='T')
ans=3;
if(s[1]=='C')
ans=pai;
if(s[1]=='S')
ans=4;
printf("%.9lf",ans);
return 0;
}
if(fir)
{
if(last-fir>1)
ans+=(last-fir-1)*2;
if(fir>=2)
{
ans+=2;
for(int i=2;i<fir;i++)
ans+=1;
double dis=0.5+(fir-2),dis0=sqrt((fir-1)*(fir-1)+(sqrt(3)/2-0.5)*(sqrt(3)/2-0.5)),d0=sqrt(dis0*dis0-0.25);
double d1=pai/2-asin(d0/dis0)-asin((sqrt(3)/2-0.5)/dis0);
if(s[fir]=='C')
ans+=d0+d1/2;
else
ans+=sqrt(dis*dis+((1-sqrt(3)/2)*(1-sqrt(3)/2)));
}
if(last<n)
{
ans+=2;
for(int i=n-1;i>last;i--)
ans+=1;
double dis=0.5+(n-last-1),dis0=sqrt((n-last)*(n-last)+(sqrt(3)/2-0.5)*(sqrt(3)/2-0.5)),d0=sqrt(dis0*dis0-0.25);
double d1=pai/2-asin(d0/dis0)-asin((sqrt(3)/2-0.5)/dis0);
if(s[last]=='C')
ans+=d0+d1/2;
else
ans+=sqrt(dis*dis+((1-sqrt(3)/2)*(1-sqrt(3)/2)));
}
if(fir==last)
{
if(fir==1||fir==n)
{
if(s[fir]=='S')
ans+=3;
else
ans+=(pai/2+0.5);
}
else{
if(s[fir]=='S')
ans+=2;
else
ans+=1;
}
}
else{
if(fir==1)
ans+=(s[fir]=='S'?3:pai/2+1);
else
ans+=(s[fir]=='S'?2:1.5);
if(last==n)
ans+=(s[last]=='S'?3:pai/2+1);
else
ans+=(s[last]=='S'?2:1.5);
}
}
else
ans=5+(n-2)*2;
printf("%.11lf",ans);
return 0;
}