Решение третьей задачи к задаче - персонаж картины - 13 CCF профессиональный компьютер сертификационный экзамен

Решение третьей задачи к задаче - персонаж картины - 13 CCF профессиональный компьютер сертификационный экзамен

Вопросы Номер: 201909-3
вопросов Имя: Характер живопись
Ограничение по времени: 5,0 с
памятью предела: 512.0MB

Here Вставка рисунка Описание
Here Вставка рисунка Описание
Here Вставка рисунка Описание
Here Вставка рисунка Описание

решение проблемы

После первой карты:
Here Вставка рисунка Описание

А потом выпустили код ACCII:
точка Я вижу код ASCII

А потом выпустили некоторые из printfфункций печати навыки:
язык C с использованием другого выходного контента%

Я должен сказать, что эта тема еще много ямы!

По теме дается способ изменения цвета переднего плана и фона, но нам нужно только использовать цвет фона, поэтому не контролировать цвет переднего плана

Во - первых, чтобы читать данные
без затруднений, обратите внимание на 16 16 шестнадцатеричное преобразуется в 10 10 не ошибкакогда шестнадцатеричный

Затем вычислить средний цвет каждой небольшой площади, у нас не было никаких проблем

Потом появились трудности, мы должны написать процесс изменения цвета.

Я выбрал первый шрифт, чтобы изменить ход строки N s лет , а затемпомощью%02Xпечати 16 16 природа шестиграннойа затем нажмите кнопку Печать N s лет каждого символа.

В свою очередь, перечислять каждый цвет, каждая печать предварительно определить, нужно ли установить новый цвет, если цвет является цветом символа перед текущим символом и не то же самое нужно изменение цвета, если текущий символ является первым символом и цвет, чем по умолчанию цвет (черный), но и изменить цвет.

Обратите внимание , что есть небольшой провал:
Here Вставка рисунка Описание
Эта карта ТМ предложение мне в течение длительного времени есть дерево ......

~~> _ <~~

неудобный

код

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#define maxn 2000
#define _for(i, a) for(LL i = 0; i < (a); ++i)
typedef long long LL;
using namespace std;

struct poi {
	LL R[3];
};

LL n, m, p, q;		//原图像尺寸,区域图像尺寸
char s[maxn * maxn];		//原像素十六进制编码
LL mm, nn;			//分割后的图像尺寸
poi a[maxn][maxn];	//像素/色块 颜色
char ans[maxn * maxn * 3];		//最终编码
LL al;				//ans长度
LL flag;			//当前颜色标识

void init() {
	al = 0;
	ans[0] = 0;
	flag = 0;	//默认背景色为黑色
}

LL getnum(char c) {	//识别十六进制数字
	if (c >= 'a' && c <= 'z') return c - 'a' + 10;
	if (c >= 'A' && c <= 'Z') return c - 'A' + 10;
	if (c >= '0' && c <= '9') return c - '0';
	return -1;
}

bool equ(LL i, LL j) {	//判断是否需要设置颜色
	LL ffl = 0, f;
	_for(k, 3) ffl = ffl * 256 + a[i][j].R[k];
	f = (ffl == flag);
	flag = ffl;
	return f;
}

void sol() {
	init();
	cin >> m >> n >> p >> q;

	//读取色块
	_for(i, n) {
		_for(j, m) {
			cin >> s;
			LL slen = strlen(s), t = 1, x, y;
			if (slen == 4) {	//#abc
				_for(k, 3) {
					x = getnum(s[t++]);
					a[i][j].R[k] = x * 16 + x;
				}
			}
			else if (slen == 2) {	//#a
				x = getnum(s[t]);
				_for(k, 3) a[i][j].R[k] = x * 16 + x;
			}
			else {	//#abcdef
				_for(k, 3) {
					x = getnum(s[t++]);
					y = getnum(s[t++]);
					a[i][j].R[k] = x * 16 + y;
				}
			}
		}
	}
	mm = m / p;
	nn = n / q;

	//算出每个小块的平均色块
	_for(i, nn) {
		_for(j, mm) {
			LL R[3] = { 0 };	//求和
			_for(k, q) {
				_for(l, p) {
					_for(o, 3) {
						R[o] += a[i*q + k][j*p + l].R[o];
					}
				}
			}
			_for(k, 3) a[i][j].R[k] = R[k] / p / q;	//平均
		}
	}

	//编码
	_for(i, nn) {
		_for(j, mm) {
			if (!equ(i, j)) {	//需要设置颜色
				LL x[3] = { a[i][j].R[0], a[i][j].R[1], a[i][j].R[2] };
				if (flag) sprintf(ans + al, "\x1B[48;2;%lld;%lld;%lldm ", x[0], x[1], x[2]), al = strlen(ans);
				else sprintf(ans + al, "\x1B[0m "), al = strlen(ans);
			}
			else sprintf(ans + al, " "), al = strlen(ans);	//不需要设置颜色

			if (j == mm - 1 && flag) sprintf(ans + al, "\x1B[0m"), al = strlen(ans), flag = 0;	//行末尾是否需要重置
			if (j == mm - 1) sprintf(ans + al, "\x0A"), al = strlen(ans);	//行末尾添加换行符
		}
	}

	//printf("%s", ans);

	//把编码转16进制输出
	for (LL i = 0; ans[i]; i++) {
		printf("\\x%02X", ans[i]);
	}
}

int main() {
	//freopen("in.txt", "r", stdin);

	sol();
	return 0;
}

/* 测试样例:
1 1
1 1
#010203

\x1B\x5B\x34\x38\x3B\x32\x3B\x31\x3B\x32\x3B\x33\x6D\x20\x1B\x5B\x30\x6D\x0A




2 2
1 2
#111111
#0
#000000
#111

\x1B\x5B\x34\x38\x3B\x32\x3B\x38\x3B\x38\x3B\x38\x6D\x20\x20\x1B\x5B\x30\x6D\x0A




4 4
2 2
#000000
#000000
#ffffff
#ffffff
#000000
#000000
#ffffff
#ffffff
#000000
#000000
#ffffff
#ffffff
#000000
#000000
#ffffff
#ffffff

\x20\x1B\x5B\x34\x38\x3B\x32\x3B\x32\x35\x35\x3B\x32\x35\x35\x3B\x32\x35\x35\x6D\x20\x1B\x5B\x30\x6D\x0A\x20\x1B\x5B\x34\x38\x3B\x32\x3B\x32\x35\x35\x3B\x32\x35\x35\x3B\x32\x35\x35\x6D\x20\x1B\x5B\x30\x6D\x0A



//printf("\033[38;2;255;0;0mHe11o\033[0m \033[38;2;0;0;255m\033[48;2;255;255;255mWor1d\033[0m\n");
*/

Опубликовано 163 оригинальные статьи · вона похвала 54 · просмотров 30000 +

рекомендация

отblog.csdn.net/weixin_42856843/article/details/103099197