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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值