2013 ACM/ICPC Asia Regional Changsha Online-Problem C:Color Representation Conversion(模拟)

来源:互联网 发布:人工智能虚拟系统 编辑:程序博客网 时间:2024/05/22 09:49

题目大意:给颜色的三种定义,再给一种颜色的参数,要求转换成另一种颜色。

题目分析:模拟。比赛的时候一直在卡精度,转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;}


原创粉丝点击