题意:给你三种颜色表示模式,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. 创建 XXXXXXXX 的配置节处理程序时出错: 请求失败

    今天碰到这个错误,之前的程序在测试的时候都没有问题,同样的程序打包通过QQ传给其他人,在XP下测试也没有问题,我的Win7系统从QQ信箱下载压缩包,解压之后执行程序就会出问题,本来还是考虑自己程序是不 ...

  2. 【Java】常用数据类型转换(BigDecimal、包装类、日期等)

    新工作转到大数据方向,每天都要面对数据类型互相转换的工作,再加上先前面试发现这部分的知识盲点, 决定复习之余自己再写一套便捷的方法,以后会比较方便.(虽然公司有现成封装的类,里头还有些遗漏的地方,暂时 ...

  3. Mybatis查询报错:There is no getter for property named '*' in 'class java.lang.String

    问题: 执行查询时报错:There is no getter for property named '*' in 'class java.lang.String 原因: 传过去的参数为识别.本例为 p ...

  4. Maven - 依赖范围<scope></scope>

    6种:

  5. 搭建Maven私有仓库

    Nexus官网下载:Nexus Repository Manager OSS :https://www.sonatype.com/download-oss-sonatype 1.解压 $ tar -z ...

  6. IDEA的下载安装和激活

    1.下载网站http://www.jetbrains.com/ 2. 3. 4.注意要下载Ultimate版本 5.安装 下载完成后直接下一步,傻瓜式安装 6.激活,在图片位置输入激活码即可 !!!! ...

  7. asp.net core-项目开发中问题汇总

    无法启动进程\Program File\dotnet\dotnet.exe.进程创建失败,出现错误:系统找不到指定的文件如下图: 解放方案:1.修改系统环境变量 2.重启电脑

  8. 改进的平台设备驱动——dev和drv完全分离

    这是平台设备: 1 #include <linux/fs.h> #include <linux/init.h> #include <linux/delay.h> # ...

  9. [BZOJ3714]Kuglarz(最小生成树)

    Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费\(C_{i,j}\)元,魔术师就会告诉 ...

  10. SAP(ABAP):STOP,EXIT,CHECK,RETURN,REJECT,CONTINUE

    Stop 命令使用该命令的程序位置INITIALIZATION, AT SELECTION-SCREEN, START-OF-SELECTION和GET 事件中处理说明1. 当在INITIALIZAT ...