题意:给你三种颜色表示模式,RGB,HSV和HSL,实现任意模式之间两两转化。

1.最好别看题目中给的转化公式描述,我觉得叙述的一点也不清楚,看维基百科,把维基百科上的公式一句一句翻译过来就好

2.在公式换算的时候,全部转成小数形式。例如:RGB的取值范围0-255转化成0-1, 即r = R/255.0, g = G/255.0 b = B/255.0……

3.HSL->RGB和HSV->RGB需要四舍五入,而HSV和HSL之间的互相转化需要通过RGB: HSV<=>RGB<=>HSL,这里转RGB的时候不需要四舍五入。

4.对于自己转自己的情况,例如RGB->RGB,直接原样输出。

写的时候脑子不是很清楚,加上WA之后各种瞎改,代码略丑= =凑合着看吧……

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm> using namespace std; const double eps = 1e-; struct node
{
int val[];
bool second;
double ang[];
}; char tar[];
char ori[];
node A, ans; int dcmp( double a )
{
if ( fabs(a) < eps ) return ;
return a < ? - : ;
} int Round( double a )
{
return (int)(a + 0.5);
} void init()
{
scanf( "%s", ori );
//printf("A: ");
char tmp[];
for ( int i = ; i < ; ++i )
{
scanf( "%s", tmp );
sscanf( tmp, "%d", &A.val[i] );
//printf( "%d ", A.val[i] );
}
A.second = false;
//puts("");
return;
} void RGBtoHSL()
{
double r, g, b;
if ( A.second )
{
r = A.ang[];
g = A.ang[];
b = A.ang[];
}
else
{
r = A.val[]/255.0;
g = A.val[]/255.0;
b = A.val[]/255.0;
} double h, l, s; //printf( "rgb: %f %f %f\n", r, g, b );
double maxi = max( max(r, g), b );
double mini = min( min(r, g), b ); double delta = maxi - mini;
if ( dcmp( maxi - mini ) == )
{
h = 0.0;
}
else if ( dcmp( maxi - r ) == )
{
if ( dcmp( g - b ) >= )
{
h = 60.0*(g-b)/delta+;
}
else
{
h = 60.0*(g-b)/delta+;
}
}
else if ( dcmp( maxi - g ) == )
{
h = 60.0*(b-r)/delta+;
}
else if ( dcmp( maxi - b ) == )
{
h = 60.0*(r-g)/delta+;
} l = 0.5*(maxi+mini);
//printf("l:%f\n", l); if ( dcmp(l) == || dcmp( delta ) == )
{
s = 0.0;
}
else if ( dcmp(l) > && dcmp( 0.5 - l ) >= )
{
s = delta/(maxi+mini);
}
else
{
s = delta/(2.0-(maxi+mini));
} //printf( "%s ", tar );
//printf("%.0f %.0f%% %.0f%%\n", h+eps, s*100+eps, l*100+eps );
//printf("%d %d%% %d%%\n", Round(h+eps), Round(s*100+eps), Round(l*100+eps) );
ans.val[] = Round(h);
ans.val[] = Round(s*);
ans.val[] = Round(l*);
return;
} void RGBtoHSV()
{
double r, g, b;
if ( A.second )
{
r = A.ang[];
g = A.ang[];
b = A.ang[];
}
else
{
r = A.val[]/255.0;
g = A.val[]/255.0;
b = A.val[]/255.0;
} double h, v, s; double maxi = max( max(r, g), b );
double mini = min( min(r, g), b ); double delta = maxi - mini;
if ( dcmp( delta ) == )
{
h = ;
}
else if ( dcmp( maxi - r ) == )
{
if ( dcmp( g - b ) >= )
{
h = 60.0*(g-b)/delta+;
}
else
{
h = 60.0*(g-b)/delta+;
}
}
else if ( dcmp( maxi - g ) == )
{
h = 60.0*(b-r)/delta+;
}
else if ( dcmp( maxi - b ) == )
{
h = 60.0*(r-g)/delta+;
} if ( dcmp( maxi ) == )
{
s = ;
}
else s = (double)(maxi-mini)/maxi; v = maxi; //printf( "%s ", tar );
//printf("%f %f %f\n", h+eps, s*100+eps, v*100+eps );
//printf("%d %d%% %d%%\n", Round(h+eps), Round(s*100+eps), Round(v*100+eps) );
ans.val[] = Round(h);
ans.val[] = Round(s*);
ans.val[] = Round(v*); return;
} void jiuzheng( double &tC )
{
if ( dcmp( tC ) < ) tC += 1.0;
if ( dcmp( tC - 1.0 ) > ) tC -= 1.0;
return;
} double GetRGB( double p, double q, double tC )
{
if ( dcmp( 1.0/6.0 - tC ) > )
{
return p + ( (q - p) * 6.0 * tC );
}
else if ( dcmp( 0.5 - tC ) > )
{
return q;
}
else if ( dcmp( 2.0/3.0 - tC ) > )
{
return p + ( (q-p)*4.0 - (q-p)*6.0*tC );
}
else return p;
} void HSLtoRGB()
{
double h, s, l;
double r, g, b;
//int R, G, B; h = A.val[]/360.0;
s = A.val[]/100.0;
l = A.val[]/100.0; if ( dcmp(s) == )
{
r = l;
g = l;
b = l;
}
else
{
double p, q, tR, tG, tB; if ( dcmp( 0.5 - l ) > )
q = l * ( 1.0 + s );
else q = l + s - ( l * s ); p = * l - q; tR = h + 1.0/3.0;
tG = h;
tB = h - 1.0/3.0; jiuzheng( tR );
jiuzheng( tG );
jiuzheng( tB ); //r = GetRGB( p, q, tR )*255.0;
r = GetRGB( p, q, tR );
//g = GetRGB( p, q, tG )*255.0;
g = GetRGB( p, q, tG );
//b = GetRGB( p, q, tB )*255.0;
b = GetRGB( p, q, tB );
} //printf( "%s ", tar );
//printf( "RGB: %d %d %d\n", r, g, b );
A.ang[] = r;
A.ang[] = g;
A.ang[] = b;
A.val[] = Round( r * );
A.val[] = Round( g * );
A.val[] = Round( b * );
//printf("HSLtoRGB: %d %d %d\n", A.val[0], A.val[1], A.val[2] );
for ( int i = ; i < ; ++i )
ans.val[i] = A.val[i]; return;
} void HSVtoRGB()
{
double h, s, v;
int R, G, B;
double r, g, b; h = A.val[];
s = A.val[] / 100.0;
v = A.val[] / 100.0; if ( dcmp(s) == )
{
r = g = b = v;
}
else
{
int hi = (int)floor(h/);
double f = h / - hi;
double p = v * ( - s );
double q = v * ( - f*s );
double t = v * ( - (-f)*s ); switch( hi )
{
case : r = v, g = t, b = p; break;
case : r = q, g = v, b = p; break;
case : r = p, g = v, b = t; break;
case : r = p, g = q, b = v; break;
case : r = t, g = p, b = v; break;
case : r = v, g = p, b = q; break;
}
} R = Round( r * 255.0 );
G = Round( g * 255.0 );
B = Round( b * 255.0 ); //printf( "%s ", tar );
//printf( "%d %d %d\n", R, G, B );
A.ang[] = r;
A.ang[] = g;
A.ang[] = b; A.val[] = R;
A.val[] = G;
A.val[] = B;
for ( int i = ; i < ; ++i )
ans.val[i] = A.val[i];
return;
} void HSVtoHSL()
{
HSVtoRGB();
A.second = true;
RGBtoHSL();
return;
} void HSLtoHSV()
{
HSLtoRGB();
A.second = true;
RGBtoHSV();
return;
} int main()
{
while ( scanf( "%s", tar ) == )
{
init();
if ( ori[] == 'R' )
{
if ( tar[] == 'L' ) RGBtoHSL();
else if ( tar[] == 'R' )
{
for ( int i = ; i < ; ++i )
ans.val[i] = A.val[i];
}
else RGBtoHSV();
}
else if ( ori[] == 'L' )
{
if ( tar[] == 'R' ) HSLtoRGB();
else if ( tar[] == 'L' )
{
for ( int i = ; i < ; ++i )
ans.val[i] = A.val[i];
}
else HSLtoHSV();
}
else
{
if ( tar[] == 'R' ) HSVtoRGB();
else if ( tar[] == 'V' )
{
for ( int i = ; i < ; ++i )
ans.val[i] = A.val[i];
}
else HSVtoHSL();
} printf( "%s ", tar );
if ( tar[] == 'R' )
{
printf( "%d %d %d\n", ans.val[], ans.val[], ans.val[] );
}
else printf( "%d %d%% %d%%\n", ans.val[], ans.val[], ans.val[] );
}
return ;
}

2013 ACM/ICPC Asia Regional Changsha Online – C题 Color Representation Conversion (坑爹模拟题)的更多相关文章

  1. 2013 ACM/ICPC Asia Regional Changsha Online - C Color Representation Conversion

    这个纯粹是一个细节题啊!!! 由于某个地方的浮点数比较写错了,WA了无数次啊…… 代码如下: #include<iostream> #include<cstdio> #incl ...

  2. 2013 ACM/ICPC Asia Regional Changsha Online G Goldbach

    比赛的时候,被题目误导了,题目最后说结果可能很大,要取模,那时就想直接求会TLE的!!! 赛后才知道,坑啊………… 代码如下: #include<iostream> #include< ...

  3. 2013 ACM/ICPC Asia Regional Changsha Online - G(DP)

    第一眼就想到DP,然后想了N久就想不到可以不重算的DP  最后没办法了 先算出来 再去重.. 因为最多只有三个 对于三个来说有三种组合情况 x+y+z, x*y*z, x*y+z 那要么 x,y,z都 ...

  4. 2013 ACM/ICPC Asia Regional Changsha Online - E

    第一个被板刷的题 取余 依次算在周几 #include <iostream> #include<cstdio> #include<cstring> #include ...

  5. 2013 ACM/ICPC Asia Regional Changsha Online J Candies

    AC了,但是不知道为什么,但是恶心的不得了~最近写代码,思路都非常清晰,但是代码各种bug~T.T~说说思路吧:二分~330ms~ 小队友fribbi的思路是离线250msAC~ 预处理solve函数 ...

  6. 2013 ACM/ICPC Asia Regional Changsha Online–C (模拟)

    题目描述 略... 题解 注意控制精度即可....变量全部定义成double,结果round就行....妈蛋....被这题目恶心死了.... 代码: #include <iostream> ...

  7. 2013 ACM/ICPC Asia Regional Changsha Online - J

    原题戳这里. 题意: 有一未知列数a1,a2,a3.....an, 已知s[i]=a[i-1]+a[i]+a[i]  (1<i<n) s[1]=a[1]+a[2]; s[n]=a[n-1] ...

  8. hduoj 4710 Balls Rearrangement 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4710 Balls Rearrangement Time Limit: 6000/3000 MS (Java/Ot ...

  9. hduoj 4708 Rotation Lock Puzzle 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4708 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/O ...

随机推荐

  1. SWFUpload 参数详解

    属性   类型 默认值 描述 upload_url String 处理上传文件的服务器端页面的url地址,可以是绝对地址,也可以是相对地址,当为相对地址时相对的是当前代码所在的文档地址 preserv ...

  2. update_TypeError

    TypeError: ( 'An update must have the same type as the original shared variable ( shared_var=W, shar ...

  3. window7配置python3.3 + django + apache24 + mod_wsgi

    window7安装配置python3.3 + django + apache24 + mod_wsgi 1.下载版本的时候要对应 2.apache24 别放系统盘, 不然权限很麻烦 3.django ...

  4. Oracle 将 A 用户下所有表的增删改查 赋予 B 用户

    第一步:创建用户 create user username identified by password; 第二步:给用户赋值接触锁定(仅仅赋予会话权限) grant create session t ...

  5. 注释java中某个方法过时

    添加一个注解即可 @Deprecated

  6. ubuntu built-in display 产生的一个原因

    在没有禁用开源的显卡驱动 nouveau 下,从 apt 安装了nvidia的驱动,导致了后面开机后,系统不能正确的识别到显示器,整个界面分辨率变的非常小,在设置菜单中的显示设置中也不能调节分辨率,并 ...

  7. FreeBSD--常用命令

    FreeBSD常用命令   查看网络流量 a.systat -if 1 (1表示1s刷新屏幕一次) b.netstat 1 # Traffic 流量 peak 峰值 average 平均值 查看进程p ...

  8. 简单php实现同一时间内一个账户只允许在一个终端登陆

    在账户表的基础上,我新建了一个账户account_session表,用来记录登录账户的account_id和最新一次登录成功用户的session_id,然后首先要修改登录方法:每次登录成功后,要将登录 ...

  9. 申请qq第三方登录 http://www.php20.com/forum.php?mod=viewthread&tid=29 (出处: 码农之家)

    百度  qq互联  进入网站 按图中的步骤申请第三方登录即可 先申请成为开发者 审核通过后再继续操作 提交 后列表中会出现提交的申请. 状态为审核中,审核通过会得到下图. 点查看 红线后面就是appi ...

  10. SpringCloud框架搭建+实际例子+讲解+系列五

    (4)服务消费者,面向前端或者用户的服务 本模块涉及到很多知识点:比如Swagger的应用,SpringCloud断路器的使用,服务API的检查.token的校验,feign消费者的使用.大致代码框架 ...