2013 ACM/ICPC Asia Regional Changsha Online-Problem C:Color Representation Conversion(模拟)
来源:互联网 发布:人工智能虚拟系统 编辑:程序博客网 时间:2024/05/22 09:49
题目大意:给颜色的三种定义,再给一种颜色的参数,要求转换成另一种颜色。
题目分析:模拟。比赛的时候一直在卡精度,转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;}
- 2013 ACM/ICPC Asia Regional Changsha Online-Problem C:Color Representation Conversion(模拟)
- 2013 ACM/ICPC Asia Regional Changsha Online - C Color Representation Conversion
- 2013 ACM/ICPC Asia Regional Changsha Online C题 Color Representation Conversion
- 2013 ACM/ICPC Asia Regional Changsha Online - C Color Representation Conversion
- 2013 ACM/ICPC Asia Regional Changsha Online - C(Color Representation Conversion)、E (Travelby Bi)解题报告
- 2013 ACM/ICPC Asia Regional Changsha Online
- 2013 ACM/ICPC Asia Regional Changsha Online Contest C
- 2013 2013 ACM/ICPC Asia Regional Changsha Online - H Hypersphere
- 简记2013 ACM/ICPC Asia Regional Changsha Online
- 2013 ACM/ICPC Asia Regional Changsha Online - I Grand Prix
- 2013 ACM/ICPC Asia Regional Changsha Online - J Candies
- 2013 ACM/ICPC Asia Regional Changsha Online - J Candies
- 2013 ACM/ICPC Asia Regional Changsha Online J Candies
- 2013 ACM/ICPC Asia Regional Changsha Online - J Candies
- 2013 ACM/ICPC Asia Regional Changsha Online J-Candies
- ZOJ 2013 ACM/ICPC Asia Regional Changsha Online G Goldbach
- 数学+模拟-2013 ACM/ICPC Asia Regional Changsha Online J 题
- zoj 数论之素数 2013 ACM/ICPC Asia Regional Changsha Online - G
- 2013 ACM/ICPC Asia Regional Changsha Online - E Travel by Bike
- 学好C++第一篇
- 求1+2+3+……+n
- 启程了
- 未来,为我而来吧!
- 2013 ACM/ICPC Asia Regional Changsha Online-Problem C:Color Representation Conversion(模拟)
- classloader知识点
- 康托展开
- Android设备中实现Orientation Sensor(图)兼谈陀螺仪
- 手机AT指令集
- Java程序实验1
- Simply Linked Implementation remove函数
- 中国首研拟态计算机,可实现自适应修改结构,类似大脑
- 2013.9.23