题目大意:给颜色的三种定义,再给一种颜色的参数,要求转换成另一种颜色。
题目分析:模拟。比赛的时候一直在卡精度,转rgb的时候应该乘255,结果乘了256。。。然后样例怎么都相差1。后来发现错误,但是没有考虑同种颜色的转换。。
详情请见代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<map>
#include<vector>
#include<set>
#include<queue>
#include<string>
using namespace std;
const double eps = 1e-8;
char from[6],to[6];
double a,b,c;
double ans1,ans2,ans3;
void fun1()
{
a = a/255.0;
b = b/255.0;
c = c/255.0;
double mx = max(a,max(b,c));
double mn = min(a,min(b,c));
double h;
double s,l;
if(fabs(mx - mn) < eps)
h = 0;
else if(fabs(mx - a) < eps && b - c > -eps)
h = (60 * (b - c)/(mx - mn));
else if(fabs(mx - a) < eps && b - c < -eps)
h = (60 * (b - c)/(mx - mn)) + 360;
else if(fabs(mx - b) < eps)
h = (60 * (c - a)/(mx - mn)) + 120;
else if(fabs(mx - c) < eps)
h = (60 * (a - b)/(mx - mn)) + 240;
l = (mx + mn)/2.0;
if(l < eps || fabs(mx - mn) < eps)
s = 0;
else if(l > 0 && (l - 0.5) <= 0)
s = (mx - mn)/(mx + mn);
else if(l - 0.5 > 0)
s = (mx - mn)/(2.0 - 2 * l);
ans1 = h;ans2 = ((s) * 100);ans3 = (((l) * 100));
}
void fun2()
{
a = a/255.0;b = b/255.0;c = c/255.0;
double mx = max(a,max(b,c));
double mn = min(a,min(b,c));
double h;
double s,v;
if(fabs(mx - mn) < eps)
h = 0;
else if(fabs(mx - a) < eps && b - c > -eps)
h = (60 * (b - c)/(mx - mn));
else if(fabs(mx - a) < eps && b - c < -eps)
h = (60 * (b - c)/(mx - mn)) + 360;
else if(fabs(mx - b) < eps)
h = (60 * (c - a)/(mx - mn)) + 120;
else if(fabs(mx - c) < eps)
h = (60 * (a - b)/(mx - mn)) + 240;
if(mx < eps)
s = 0;
else
s = 1 - mn/mx;
v = mx;
ans1 = h;ans2 = ((s) * 100);ans3 = (((v) * 100));
}
void fun3()//hsl->rgb
{
b = b/100.0;c = c/100.0;
double rr,gg,bb,cc;
cc = (1 - fabs(2 * c - 1)) * (b);
double h = a/60.0;
double x;
x = cc * (1 - fabs(h - (2*(int)(h/2)) - 1));
if(h > -eps && h - 1 < -eps)
rr = cc,gg = x,bb = 0;
else if(h - 1 > -eps && h - 2 < -eps)
rr = x,gg = cc,bb = 0;
else if(h - 2 > -eps && h - 3 < -eps)
rr = 0,gg = cc,bb = x;
else if(h - 3 > -eps && h - 4 < -eps)
rr = 0,gg = x,bb = cc;
else if(h - 4 > -eps && h - 5 < -eps)
rr = x,gg = 0,bb = cc;
else if(h - 5 > -eps && h - 6 < -eps)
rr = cc,gg = 0,bb = x;
else
rr = 0,gg = 0,bb = 0;
double mm = c - cc / 2;
rr = rr + mm;gg = gg + mm;bb = bb + mm;
ans1 = ((rr) * 255);
ans2 = ((gg) * 255);
ans3 = ((bb) * 255);
}
void fun4()//hsv->rgb
{
b = b/100.0;c = c/100.0;
double cc = (b * c);
double h = a/60.0;
double x;
x = cc * (1 - fabs(h - (((int)(h/2))*2) - 1));
double rr,gg,bb;
if(h > -eps && h - 1 < -eps)
rr = cc,gg = x,bb = 0;
else if(h - 1 > -eps && h - 2 < -eps)
rr = x,gg = cc,bb = 0;
else if(h - 2 > -eps && h - 3 < -eps)
rr = 0,gg = cc,bb = x;
else if(h - 3 > -eps && h - 4 < -eps)
rr = 0,gg = x,bb = cc;
else if(h - 4 > -eps && h - 5 < -eps)
rr = x,gg = 0,bb = cc;
else if(h - 5 > -eps && h - 6 < -eps)
rr = cc,gg = 0,bb = x;
else
rr = 0,gg = 0,bb = 0;
double mm = c - cc;
rr = rr + mm;gg = gg + mm;bb = bb + mm;
ans1 = ((rr) * 255);
ans2 = ((gg) * 255);
ans3 = ((bb) * 255);
}
int nextint()
{
int ret;
char ch;
while((ch = getchar()) > '9' || ch < '0')
;
ret = ch - '0';
while((ch = getchar()) >= '0' && ch <= '9')
ret = ret * 10 + ch - '0';
return ret;
}
int main()
{
while(scanf("%s",to) != EOF)
{
scanf("%s",from);
if(strcmp(from,"RGB") == 0)
scanf(" %lf %lf %lf",&a,&b,&c);
else
scanf("%lf%lf%*c%lf%*c",&a,&b,&c);
printf("%s ",to);
if(strcmp(from,"RGB") == 0)
{
if(strcmp(to,"HSL") == 0)
fun1();
else if(strcmp(to,"HSV") == 0)
fun2();
else
{
printf("%.0lf %.0lf %.0lf\n",a,b,c);
continue;
}
if((int)(ans1 + 0.5) == 360)
ans1 = 0;
if((int)(ans2 + 0.5) > 100)
ans2 = 100;
if((int)(ans3 + 0.5) > 100)
ans3 = 100;
printf("%.0lf %.0lf%% %.0lf%%\n",ans1,ans2,ans3);
}
else
{
if(strcmp(from,"HSL") == 0)
{
if(strcmp(to,"RGB") == 0)
{
fun3();
if((int)(ans1 + 0.5) > 255)
ans1 = 255;
if((int)(ans2 + 0.5) > 255)
ans2 = 255;
if((int)(ans3 + 0.5) > 255)
ans3 = 255;
printf("%.0lf %.0lf %.0lf\n",ans1,ans2,ans3);
}
else if(strcmp(to,"HSV") == 0)
{
fun3();
a = ans1,b = ans2,c = ans3;
fun2();
if((int)(ans1 + 0.5) == 360)
ans1 = 0;
if((int)(ans2 + 0.5) > 100)
ans2 = 100;
if((int)(ans3 + 0.5) > 100)
ans3 = 100;
printf("%.0lf %.0lf%% %.0lf%%\n",ans1,ans2,ans3);
}
else
{
printf("%.0lf %.0lf%% %.0lf%%\n",a,b,c);
}
}
else
{
if(strcmp(to,"RGB") == 0)
{
fun4();
if((int)(ans1 + 0.5) > 255)
ans1 = 255;
if((int)(ans2 + 0.5) > 255)
ans2 = 255;
if((int)(ans3 + 0.5) > 255)
ans3 = 255;
printf("%.0lf %.0lf %.0lf\n",ans1,ans2,ans3);
}
else if(strcmp(to,"HSL") == 0)
{
fun4();
a = ans1,b = ans2,c = ans3;
fun1();
if((int)(ans1 + 0.5) == 360)
ans1 = 0;
if((int)(ans2 + 0.5) > 100)
ans2 = 100;
if((int)(ans3 + 0.5) > 100)
ans3 = 100;
printf("%.0lf %.0lf%% %.0lf%%\n",ans1,ans2,ans3);
}
else
{
printf("%.0lf %.0lf%% %.0lf%%\n",a,b,c);
}
}
}
}
return 0;
}