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. 浅谈maven setting.xml 设置的mirrorof标签作用。

    https://blog.csdn.net/whbing1471/article/details/53983779 A 看这一段 背景:写好的java项目放置到linux服务器上进行编辑的时候,由于m ...

  2. 简单实现python调用c#dll动态链接库

    在python调用c#dll库时要先安装库clr,即安装pythonnet,参考文章:https://www.cnblogs.com/kevin-Y/p/10235125.html(为在python中 ...

  3. 两数相加(C#数据结构和算法练习)

    两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  4. python卸载重新安装,一键安装卸载前的所有安装的第三方插件

    好多小可爱都有这样一个困扰,python有了一个大版本的更新,我也想更新,但是安装的好多第三方的库可怎么办呀,更新之后再去一个一个的安装,那可就烦死了. 在这里我来教大家如何快速去安装python更新 ...

  5. 千万不要用window自带文本编辑器编辑配置文件或者代码

    1 引言 用windows自带的text文本在最前面会带入看不到的BOM,导致异常 2 代码 package main import ( "strings" "fmt&q ...

  6. vue 鼠标右击事件

    使用@contextmenu.prevent即可 参考:https://www.cnblogs.com/sxz2008/p/6953082.html

  7. Java自学-接口与继承 默认方法

    默认方法 步骤 1 : 什么是默认方法 默认方法是JDK8新特性,指的是接口也可以提供具体方法了,而不像以前,只能提供抽象方法 Mortal 这个接口,增加了一个默认方法 revive,这个方法有实现 ...

  8. Java自学-类和对象 包

    Java中的 包 包: package 把比较接近的类,规划在同一个包下 步骤 1 : 把比较接近的类,规划在同一个包下 Hero,ADHero 规划在一个包,叫做charactor(角色) Item ...

  9. JavaScript 简单类型和复杂类型区别

    一.基本类型 1.概述 值类型又叫做基本数据类型,简单数据类型.在存储时,变量中存储的是值本身,因此叫做值类型 2.基本类型在内存中的存储 基本数据类型存储在栈区中. 3.基本类型作为函数的参数 基本 ...

  10. Solr新特性【4.x,5.x,6.x,7.x】

    一.Solr4.x新特性 1.近实时搜索 Solr的近实时搜索[Near Real-Time,NRT]功能实现了文档添加到搜索的快速进行,以应对搜索快速变化的数据. 2.原子更新与乐观并发 原子更新功 ...