题意:给你三种颜色表示模式,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. 10分钟了解 代理模式与java中的动态代理

    前言    代理模式又分为静态代理与动态代理,其中动态代理是Java各大框架中运用的最为广泛的一种模式之一,下面就用简单的例子来说明静态代理与动态代理. 场景    李雷是一个唱片公司的大老板,很忙, ...

  2. ThinkPHP:create()方法有什么用呢?

    1.create方法可以对POST提交的数据进行处理(通过表中的字段名称与表单提交的名称对应关系自动封装数据实例),例如user表中有一个字段名叫"username",如果表单中有 ...

  3. using System.Security.Cryptography

    这个命名空间主要是用来进行加密的一些类. 加密服务: 公共网络(如 Internet)不提供实体之间安全通信的方式. 此类网络上的通信易被读取或甚至被未经授权的第三方修改. 加密有助于防止数据被查看, ...

  4. Linux添加新硬盘,设置分区和开机自动挂载之图文教程!

    虚拟机添加硬盘的步骤就不多废话了,主要列出添加硬盘后要进行设置的几个详细步骤: 1.查看磁盘信息:fdisk -ls 添加前如下图所示: 添加后如下图: 也可以用:ls /dev/sd*查看,如下图: ...

  5. JavaScript中并非一切皆对象

    对象是js中的基础以及核心,在js中有六种主要类型:string  number  boolean null undefined object 除了oject类型以为其他五种本身并非对象,null本身 ...

  6. BZOJ3669: [Noi2014]魔法森林(瓶颈生成树 LCT)

    Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 3558  Solved: 2283[Submit][Status][Discuss] Descript ...

  7. 如何解决mysql中读取含表情符号的内容无法识别的问题

    当内容中包含有表情符号的时候,写入mysql时一般会设置字段或者表的charset为utf8mb4的形式: ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicod ...

  8. 宁夏邀请赛F FLOYD

    Moving On Firdaws and Fatinah are living in a country with nn cities, numbered from 11 to nn.Each ci ...

  9. Python logging 模块简介

    Table of Contents 1. Logging 模块 1.1. 简介 1.2. 简单输出日志 1.3. 输入日志到文件 1.4. 几个基本概念 1.4.1. loggers 1.4.2. h ...

  10. PHP.19-验证码生成

    生成验证码 思路:先定义验证码函数getCode() //绘制验证码 $num = 4; //字符长度 getCode($num, 2); 1.创建画布,分配颜色 imagecreatetruecol ...