CCF 201909-3 字符画
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 字符画的更多相关文章
- HTML5将图片转化成字符画
HTML5将图片转化成字符画 字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置 ...
- Swift 实现图片转字符画的功能
本文介绍一个IOS APP , 将图片转换成ASCII字符画,使用Swift语言编写. 举个例子,我们使用著名的蕾娜照片作为原图片 经APP转换后形成的字符画,我们打印出来,效果如下: 放大她的脸部可 ...
- 基于 canvas 将图片转化成字符画
字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢? HTML5 让这个可能变成了现实,通过 canvas,可以很轻松实现这个功能. 其实原理很简单:扫描图片相应位置的像素点,再计算出其灰 ...
- 用函数式的 Swift 实现图片转字符画的功能
今天整理 Pocket 中待看的文章,看到这篇<Creating ASCII art in functional Swift>,讲解如何用 Swift 将图片转成 ASCII 字符.具体原 ...
- 将图片转为ASCII字符画
原文:将图片转为ASCII字符画 Copyright 2012 Conmajia 源代码下载:点击这里 什么是字符画?就是用ASCII字符来近似组成图像,就像这样: ╭╮ ╭╮ ││ ││ ╭┴┴—— ...
- Python 图片转字符画
Python 图片转字符画 一.课程介绍 1. 课程来源 原创 2. 内容简介 本课程讲述怎样使用 Python 将图片转为字符画 3. 前置课程 Python编程语言 Linux 基础入门(新版) ...
- Python 视频转字符画 - 进阶
这篇文章是 视频转字符动画-Python-60行代码 的后续,如果感兴趣,请先看看它. 1. 速度优化 要是每次播放都要等个一分钟,也太痛苦了一点. 所以可以用 pickle 模块把 video_ch ...
- python 图片在线转字符画预览
文章链接:https://mp.weixin.qq.com/s/yiFOmljhyalE8ssAgwo6Jw 关于python图片转字符画,相信大家都不陌生,经常出现在 n个超有趣的python项目中 ...
- Java实现把图片转成字符画
1,先看效果图:
随机推荐
- mysql数据库事务
事务: 一个或者一组sql语句组成一个执行的单元,这个单元要么全都执行,要么都不执行.也就是每个sql语句相互依赖.如果中间有一条出现错误则整个单元将回滚.(回滚就是刚刚的操作都撤销) 事务的属性: ...
- 再谈初学者关心的ssh应用方方面面
http://blog.robertelder.org/what-is-ssh/ https://www.ssh.com/ssh/key/ 什么是ssh? ssh是一个在计算机之间实现安全通信的网络协 ...
- vue中使用radio和checkbox
代码 <template> <div id="app"> <input type="checkbox" v-model=" ...
- English--分词短语
English|分词短语 现在开始讲解分词短语的内容.在英语的语法世界里面,想要将句子写的漂亮,分词短语,你值得拥有! 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力 ...
- 谈谈游戏服务端SDK接入
“接sdk其实本质上就是一个对着接口文档写adaptor的工作,重复和无味.” 团队减员,身负多职,上一次调SDK已经可以回溯到游戏测试前夕了... 一般SDK只包含验证和支付功能,绝少部分SDK包含 ...
- Vue事件修饰符,.capture关键字详解
.prevent 用于阻止默认事件,点击a标签href可以打开相应的链接,那么给事件加 上此关键字,click.prevent .capture 冒泡顺序 例如 div1中嵌套div2中嵌 ...
- Synchronized与ReentrantLock区别总结
这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍. 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式 ...
- WPE 过滤器 滤镜 用法
过滤所有数值匹配的数据包,并修改指定的bit位 打开游戏 打开WPE 附加游戏进程 选项配置 用来配置抓取发送和接收包类型 先抓取发送包,也就是游戏中主动发给服务器的包 点击开始抓包 输入喊话内容 分 ...
- Linux相关目录
Linux 启动流程 Linux--基本目录 Linux--selinux Linux--网卡配置 Linux--系统运行级别 Linux--重要文件
- org.apache.catalina.core.StandardService - Stopping service [Tomcat]
今天在启动springboot项目突然启动失败,但是在测试日志文件,以为是日志出错,下面这个是logback打印的异常信息. 2019-05-30 15:09:10.686 [restartedMai ...