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. http://www.cnblogs.com/xdp-gacl/p/4200090.html

    孤傲苍狼 只为成功找方法,不为失败找借口! JavaWeb学习总结(五十)——文件上传和下载 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功 ...

  2. 使用IDEA创建maven父子工程项目

    http://www.pianshen.com/article/3070289153/ 第一步: 打开IDEA,点击create new project,如果没有弹出如下界面,就先将打开的项目关闭,然 ...

  3. postman发送数据,django 获取接收数据

    postman发起请求如下图 在django中使用如下方式获取token print(request.META) token = request.META.get('HTTP_X_TOKEN')

  4. 2019 东方网java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.东方网等公司offer,岗位是Java后端开发,因为发展原因最终选择去了东方网,入职一年时间了,也成为了面试官 ...

  5. 简单了解Eureka

    1.Eureka简介 Eureka是Spring Cloud Netflix微服务套件中的一部分,是一套成熟的服务注册和发现组件,可以与Springboot构建的微服务很容易的整合起来. Eureka ...

  6. Django--一对多表操作

    目录 Django--一对多表操作 需求 步骤 添加路由映射关系 学生表的增删改查 ajax更新和添加 Django--一对多表操作 今天还以一个学生管理系统为例,先通过pymysql这个模块,进行一 ...

  7. mybatis关联映射一对一

    在项目开发中,会存在一对一的关系,比如一个人只有一个身份证,一个身份证只能给一个人使用,这就是一对一关系.一对一关系使用主外键关联. table.sql,在数据库中创建如下两个表并插入数据 CREAT ...

  8. Node.js 连接 MongoDB数据库

    安装指令:npm install mongodb var mongodb = require("mongodb");// console.log(mongodb); var Mon ...

  9. JAVA - Windows下JDK自动设置脚本

    CMD窗口如果使用下面脚本代码出现乱码,则按照下文处理后,就可以了: https://www.cnblogs.com/sunylat/p/11308037.html @echo off echo ** ...

  10. Java JDBC事务

    JDBC默认是自动提交,事务是关闭的,statement|preparedStatement.executeUpdate()或excute()执行增删改,执行一次就提交一次(自动同步到数据库). JD ...