2013 ACM/ICPC Asia Regional Changsha Online – C题 Color Representation Conversion (坑爹模拟题)
题意:给你三种颜色表示模式,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 (坑爹模拟题)的更多相关文章
- 2013 ACM/ICPC Asia Regional Changsha Online - C Color Representation Conversion
这个纯粹是一个细节题啊!!! 由于某个地方的浮点数比较写错了,WA了无数次啊…… 代码如下: #include<iostream> #include<cstdio> #incl ...
- 2013 ACM/ICPC Asia Regional Changsha Online G Goldbach
比赛的时候,被题目误导了,题目最后说结果可能很大,要取模,那时就想直接求会TLE的!!! 赛后才知道,坑啊………… 代码如下: #include<iostream> #include< ...
- 2013 ACM/ICPC Asia Regional Changsha Online - G(DP)
第一眼就想到DP,然后想了N久就想不到可以不重算的DP 最后没办法了 先算出来 再去重.. 因为最多只有三个 对于三个来说有三种组合情况 x+y+z, x*y*z, x*y+z 那要么 x,y,z都 ...
- 2013 ACM/ICPC Asia Regional Changsha Online - E
第一个被板刷的题 取余 依次算在周几 #include <iostream> #include<cstdio> #include<cstring> #include ...
- 2013 ACM/ICPC Asia Regional Changsha Online J Candies
AC了,但是不知道为什么,但是恶心的不得了~最近写代码,思路都非常清晰,但是代码各种bug~T.T~说说思路吧:二分~330ms~ 小队友fribbi的思路是离线250msAC~ 预处理solve函数 ...
- 2013 ACM/ICPC Asia Regional Changsha Online–C (模拟)
题目描述 略... 题解 注意控制精度即可....变量全部定义成double,结果round就行....妈蛋....被这题目恶心死了.... 代码: #include <iostream> ...
- 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] ...
- 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 ...
- 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 ...
随机推荐
- 为什么实例没有prototype属性?什么时候对象会有prototype属性呢?
为什么实例没有prototype属性?什么时候对象会有prototype属性呢? javascript loudou 1月12日提问 关注 9 关注 收藏 6 收藏,554 浏览 问题对人有帮助,内容 ...
- python_4_interaction
#1(方法1)尽量不用这种拼接法,效率低下,占用内存多 name=input("name:") age=input('age:') job=input('job:') salary ...
- android 圆角图片的实现形式
android 圆角图片的实现形式,包括用第三方.也有系统的.比如makeramen:roundedimageview,系统的cardview , glide .fresco . compile 'c ...
- 【模板时间】◆模板·I◆ 倍增计算LCA
[模板·I]LCA(倍增版) 既然是一篇重点在于介绍.分析一个模板的Blog,作者将主要分析其原理,可能会比较无趣……(提供C++模板) 另外,给reader们介绍另外一篇非常不错的Blog(我就是从 ...
- 基于mybatis设计简单信息管理系统1
驼峰式命名法 骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始:第二个单词的首字母大写或每一个单词的首字母都采用大写字母,例如:myFirs ...
- 连接mysql 报错 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
网上找不到 朋友说是因为非正常关机导致,mysql.server start 运行报错 ERROR! The server quit without updating PID file(): 解决办 ...
- css3 媒体查询的学习。
1.什么是媒体查询 媒体查询可以让我们根据设备显示器的特性(如视口宽度.屏幕比例.设备方向:横向或纵向)为其设定CSS样式,媒体查询由媒体类型和一个或多个检测媒体特性的条件表达式组成.媒体查询中可用于 ...
- 虚拟机桥接模式下多台Ubuntu16.04系统互相连接
1.首先新建一个虚拟机并在该虚拟机上安装Ubuntu16.04系统.为这台虚拟机起名为Ubuntu3. 2.对Ubuntu3进行克隆,为新克隆生成的虚拟机起名为Ubuntu2.(这时我们会发现Ubun ...
- 3、springboot配置文件占位符
RandomValuePropertySource:配置文件中可以使用随机数 ${random.value}.${random.int}.${random.long}.${random.int(10) ...
- POJ:2449-Remmarguts' Date(单源第K短路)
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 33081 Accepted: 8993 Des ...