输入输出样例
样例1
输入
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 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
样例3
输入
1 1
1 1
#0
输出
\x20\x0A
样例4
输入
2 2
2 1
#111111
#0
#000000
#111
输出
\x1B\x5B\x34\x38\x3B\x32\x3B\x38\x3B\x38\x3B\x38\x6D\x20\x1B\x5B\x30\x6D\x0A\x1B\x5B\x34\x38\x3B\x32\x3B\x38\x3B\x38\x3B\x38\x6D\x20\x1B\x5B\x30\x6D\x0A
样例5
输入
2 2
2 1
#111111
#0
#000000
#000
输出
\x1B\x5B\x34\x38\x3B\x32\x3B\x38\x3B\x38\x3B\x38\x6D\x20\x1B\x5B\x30\x6D\x0A\x20\x0A
样例6
输入
3 2
1 2
#0
#0
#010101
#010102
#0
#0
输出
\x1B\x5B\x34\x38\x3B\x32\x3B\x30\x3B\x30\x3B\x31\x6D\x20\x1B\x5B\x30\x6D\x20\x20\x0A
样例7
输入
1 2
1 2
#123456
#abcdef
输出
\x1B\x5B\x34\x38\x3B\x32\x3B\x39\x34\x3B\x31\x32\x38\x3B\x31\x36\x32\x6D\x20\x1B\x5B\x30\x6D\x0A
样例8
输入
2 1
2 1
#654321
#fedcba
输出
\x1B\x5B\x34\x38\x3B\x32\x3B\x31\x37\x37\x3B\x31\x34\x33\x3B\x31\x30\x39\x6D\x20\x1B\x5B\x30\x6D\x0A
题解一
多的测试样例来自:https://blog.csdn.net/qq_42295427/article/details/104425068?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
独立写出来,哭了,写了一个多小时。100分。
题目说的非常复杂,但不需要考虑字符颜色,只考虑背景颜色。什么时候需要改变,什么时候用默认,根据题目说明严格遵守。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] strs = reader.readLine().split(" ");
int m = Integer.parseInt(strs[0]);
int n = Integer.parseInt(strs[1]);
strs = reader.readLine().split(" ");
int p = Integer.parseInt(strs[0]);
int q = Integer.parseInt(strs[1]);
// 所有像素的颜色
Color[][] pixs = new Color[n][m];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
pixs[i][j] = new Color(reader.readLine());
}
}
Color[] block = new Color[p * q];
Color currentColor = new Color();
for (int i = 0; i < n / q; ++i) {
for (int j = 0; j < m / p; ++j) {
int baseX = i * q;
int baseY = j * p;
int len = 0;
for (int x = 0; x < q; ++x) {
for (int y = 0; y < p; ++y) {
block[len++] = pixs[baseX + x][baseY + y];
}
}
// 求色块的平均颜色
Color avgColor = Color.average(block);
// 颜色不同才需要改变
if (!currentColor.equals(avgColor)) {
if (avgColor.isDefault()) {
reset();
} else {
change(avgColor);
}
currentColor = avgColor;
}
print(' ');
}
if (!currentColor.isDefault()) {
reset();
currentColor = new Color();
}
print('\n');
}
}
/**
* 颜色重置
*/
private static void reset() {
char[] chars = new char[4];
chars[0] = 27;
chars[1] = '[';
chars[2] = '0';
chars[3] = 'm';
print(chars);
}
/**
* 改变成指定颜色
*
* @param color 目标颜色
*/
private static void change(Color color) {
StringBuilder sBuilder = new StringBuilder(19);
sBuilder.append((char) 27);
sBuilder.append("[48;2;");
sBuilder.append(color.R);
sBuilder.append(';');
sBuilder.append(color.G);
sBuilder.append(';');
sBuilder.append(color.B);
sBuilder.append('m');
print(sBuilder.toString().toCharArray());
}
/**
* 按要求打印序列
*
* @param chars 字符数组
*/
private static void print(char[] chars) {
for (int i : chars) {
// 两位十六进制, 不足左侧补0
System.out.printf("\\x%02X", i);
}
}
/**
* 按要求打印序列
*
* @param ch 单个字符
*/
private static void print(int ch) {
System.out.printf("\\x%02X", ch);
}
}
class Color {
int R;
int G;
int B;
/**
* 默认颜色
*/
public Color() {
R = 0;
G = 0;
B = 0;
}
public Color(int R, int G, int B) {
this.R = R;
this.G = G;
this.B = B;
}
/**
* 解析颜色
*
* @param s 简化或未简化的颜色代码
*/
public Color(String s) {
StringBuilder sBuilder = new StringBuilder();
switch (s.length()) {
case 2:
for (int i = 0; i < 6; ++i) {
sBuilder.append(s.charAt(1));
}
s = sBuilder.toString();
break;
case 4:
for (int i = 0; i < 6; ++i) {
sBuilder.append(s.charAt(i / 2 + 1));
}
s = sBuilder.toString();
break;
default:
s = s.replace("#", "");
}
R = Integer.parseInt(s.substring(0, 2), 16);
G = Integer.parseInt(s.substring(2, 4), 16);
B = Integer.parseInt(s.substring(4, 6), 16);
// System.out.println(s);
// System.out.println("R:" + R + " G:" + G + " B:" + B);
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Color) {
Color o = (Color) obj;
return (R == o.R) && (G == o.G) && (B == o.B);
}
return false;
}
public boolean isDefault() {
return (R == 0) && (G == 0) && (B == 0);
}
/**
* 求色块的平均颜色
*
* @param colors 颜色数组
* @return 平均颜色
*/
public static Color average(Color[] colors) {
int r = 0;
int g = 0;
int b = 0;
for (Color color : colors) {
r += color.R;
g += color.G;
b += color.B;
}
return new Color(r / colors.length, g / colors.length, b / colors.length);
}
}