输入输出样例
样例1
输入
1 11 1#010203
输出
\x1B\x5B\x34\x38\x3B\x32\x3B\x31\x3B\x32\x3B\x33\x6D\x20\x1B\x5B\x30\x6D\x0A
样例2
输入
2 21 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 11 1#0
输出
\x20\x0A
样例4
输入
2 22 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 22 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 21 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 21 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 12 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) {// 两位十六进制, 不足左侧补0System.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);}@Overridepublic 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);}}
