CCF 201909-3 字符画

题意:

  • 将n * m的RGB图片压缩成q * p的块,每块为该原像素的平均值,我们暂且称之为像素块(代码注释为字符块) 。

  • 输入n行m列的RGB图片:

    • 第一行:图片的宽m高n
    • 第二行:要压缩的单位宽p高q,即对原图片的每q*p个像素取平均值得到像素块,保证输入得到整数个像素块。
    • 接下来n*m行,自上到下,自左往右输入图片的HTML格式的像素:
      • #a 表示RGB(0xaa,0xaa,0xaa)
      • #abc 表示RGB(0xaa,0xbb,0xcc)
      • #abcdef 表示RGB(0xab,0xcd,0xef)
  • 输出压缩后的图片的背景色

    • 像素块行处理:

      • 若背景色与该行的像素块的前一块(第一块与默认值比较)颜色相同,则不处理;否则若与默认值相同则输出 ESC[0m 的格式化表示,不相同则输出 ESC[48;2;R;G;Bm 的格式化表示(此处RGB指代像素块的RGB)。
      • 每一个像素块后必须紧跟一个格式化的空格: \x20
    • 像素块行尾处理:
      • 若该行的最后一个像素块颜色不是默认值则输出 ESC[0m 的格式化表示。
      • 始终在像素块行尾追加一个格式化的回车: \x0A

考点:

  • 字符串进制转换
  • 递推循环
  • 数字按位分割

        上面引自Here

//100分 453ms
#include<iostream>
#include<iomanip>
#define OPT __attribute__((optimize("O3")))
using namespace std;
const int N=2e3;
short c[N][N][];//c[n][m][Pixel:RGB] 表示原图片在第n行m列的像素颜色
int m,n,p,q,PQ,R,G,B,r,g,b,num[];string s;
OPT inline short getCell(const char &a,const char &b){//将16进制像素数转换为10进制的char
return (isalpha(a)?(+a-'a'):(a-''))*+(isalpha(b)?(+b-'a'):(b-''));
}
OPT inline void outChar(const char &ch){//输出题意格式化的字符
cout<<"\\x"<<hex<<uppercase<<setw()<<int(ch);
}
OPT inline void outStr(const string &str){//输出题意格式化的字符串
for(const char &ch:str) outChar(ch);
}
inline void outCell(int x){
int cnt();
if(!x) num[++cnt]=;
for(;x;x/=) num[++cnt]=x%;
for(int i=cnt;i;i--) outChar(char(num[i]+''));
}
OPT int main(){
ios::sync_with_stdio(false);
cin>>m>>n>>p>>q,PQ=p*q,cout.fill('');
for(int i=;i<=n;i++){
for(int j=,len;j<=m;j++){
cin>>s;len=s.length();
switch(len){//统一格式标准化为 #abcdef
case :s=s+string(,s[]);break;
case :s="#"+string(,s[])+string(,s[])+string(,s[]);break;
}
for(int k=;k<;k++) c[i][j][k]=getCell(tolower(s[k*+]),tolower(s[k*+]));
}
}
for(int i=;i<=n;i+=q){//共n/q个字符块行
for(int j=;j<=m;j+=p){//每字符块行共m/p段
R=G=B=;//以下处理属于i行j段的字符块
for(int k=i,ke=k+q;k<ke;k++)
for(int l=j,le=j+p;l<le;l++)
R+=c[k][l][],G+=c[k][l][],B+=c[k][l][];
R/=PQ,G/=PQ,B/=PQ;//求平均值
if(R!=r||G!=g||B!=b){//如果与该行上一段的颜色不同
if(!R&&!G&&!B)//如果与默认值相同
outStr(string(,char())+"[0m");
else//其他颜色处理
outStr(string(,char())+"[48;2;"),outCell(R),outChar(';'),outCell(G),outChar(';'),outCell(B),outChar('m');
r=R,g=G,b=B;//记录上次的颜色
}
outChar(' ');//输出 (n*m)/(p*q) 个空格
}
if(R||G||B) outStr(string(,char())+"[0m");//行尾判断是否需要重置颜色
r=g=b=;//重置默认颜色
outChar('\n');//输出n/q个回车
}
return ;
}

CCF 201909-3 字符画的更多相关文章

  1. HTML5将图片转化成字符画

    HTML5将图片转化成字符画 字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置 ...

  2. Swift 实现图片转字符画的功能

    本文介绍一个IOS APP , 将图片转换成ASCII字符画,使用Swift语言编写. 举个例子,我们使用著名的蕾娜照片作为原图片 经APP转换后形成的字符画,我们打印出来,效果如下: 放大她的脸部可 ...

  3. 基于 canvas 将图片转化成字符画

    字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢? HTML5 让这个可能变成了现实,通过 canvas,可以很轻松实现这个功能. 其实原理很简单:扫描图片相应位置的像素点,再计算出其灰 ...

  4. 用函数式的 Swift 实现图片转字符画的功能

    今天整理 Pocket 中待看的文章,看到这篇<Creating ASCII art in functional Swift>,讲解如何用 Swift 将图片转成 ASCII 字符.具体原 ...

  5. 将图片转为ASCII字符画

    原文:将图片转为ASCII字符画 Copyright 2012 Conmajia 源代码下载:点击这里 什么是字符画?就是用ASCII字符来近似组成图像,就像这样: ╭╮ ╭╮ ││ ││ ╭┴┴—— ...

  6. Python 图片转字符画

    Python 图片转字符画 一.课程介绍 1. 课程来源 原创 2. 内容简介 本课程讲述怎样使用 Python 将图片转为字符画 3. 前置课程 Python编程语言 Linux 基础入门(新版) ...

  7. Python 视频转字符画 - 进阶

    这篇文章是 视频转字符动画-Python-60行代码 的后续,如果感兴趣,请先看看它. 1. 速度优化 要是每次播放都要等个一分钟,也太痛苦了一点. 所以可以用 pickle 模块把 video_ch ...

  8. python 图片在线转字符画预览

    文章链接:https://mp.weixin.qq.com/s/yiFOmljhyalE8ssAgwo6Jw 关于python图片转字符画,相信大家都不陌生,经常出现在 n个超有趣的python项目中 ...

  9. Java实现把图片转成字符画

    1,先看效果图:

随机推荐

  1. java版的状态机实现

    状态机适用场景: C的操作,需要等到A.B的两个操作(A.B顺序操作),那就需要在 A.B之间创建一个状态机(state machine),C的操作需要状态机达到某一个状态才能进行 1. Overvi ...

  2. .net Core 解决Form value count limit 1024 exceeded. (文件上传过大)

    异常清空如图 原因:.net core提交的表单限制太小导致页面表单提交失败 在控制器上使用 RequestFormLimits attribute [RequestFormLimits(ValueC ...

  3. 解决TensorFlow在terminal中正常但在jupyter notebook中报错的方案

    报错情况: # 本地运行正常,jupyter中无法 import tensorflow ImportError: libcublas.so.10.0: cannot open shared objec ...

  4. Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法

    Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法 一丶ORM常用字段 ...

  5. 【开发笔记】-Tomcat启动时设置Jdk版本

    1. Window版本Tomcat 到bin下的setclasspath.bat文件,在文件的开始处添加如下代码: set JAVA_HOME=D:\Program Files\Java\jdk1.8 ...

  6. 【转载】如何删除Windows远程桌面保存的账号密码数据

    在Windows系统中,无论是win7.win8还是win10系统,都可使用Windows系统自带的远程桌面连接工具来远程服务器,很多时候Windows远程桌面在连接一次后会自动保存连接的账号密码等信 ...

  7. Ubuntu 下搭建VNC服务器

    Ubuntu 18.04 搭建VNC服务器https://www.jianshu.com/p/f58fe5cdeb5f ubuntu16.04 vncserver配置https://blog.csdn ...

  8. Excel 批量导入Mysql(创建表-追加数据)

    之前弄数据库的时候, 测试excel导mysql, 中间用pandas 处理后再入库.  直接上代码, 此种有真意, 尽在不言中. #!/usr/bin/env python # coding: ut ...

  9. Docker 0x01:Docker Container容器技术

    目录 Docker Container容器技术 一句话回答什么是容器? 为什么要有容器? 容器技术的影响 容器技术浅谈原理,怎么实现的?为什么能够这样轻量级标准化 难点 容器的标准 花边 Docker ...

  10. 【前端_js】Bootstrap之表单验证

    Bootstrap表单验证插件bootstrapValidator使用方法整理 BootstrapValidator 表单验证超详细教程