题目分析:
题目很长,读懂之后就很简单。描述里面还有一点混淆视听,前景色在本体里面是用不到的,色块怎么前景色的嘛。
题目大概意思就是:将图片切割成小图片,每个小图片用一个色块块,色块的颜色取小图片内所有像素的均值(向下取整),按他的编码输出。
- 空格代表色块,对应的字符串表示其颜色, 每一行最后需要一个换行符
- 色块颜色和默认背景色相同,则使用默认背景色的命令
- 色块颜色与当前的背景色相同,且不使用换背景色的命令(直接添加‘ ’)
- 每行色块扫描完成后,将背景色重置为默认颜色
- 输出的字符使用ASCII码(16进制,大写)
- 输出结果不换行
提交代码(80分):
class Pixle(): def __init__(self, r, g, b): self.r = r self.g = g self.b = b m,n = map(int, input().split()) p,q = map(int, input().split()) esc = '\\x1B\\x5B' #ESC[ a_chr = '\\x3B' # ; a_0 = '\\x30' # 0 a_48 = '\\x34\\x38\\x3B\\x32\\x3B' # 48;2; a_m = '\\x6D' # m a_space = '\\x20' # ' ' a_n = '\\x0A' # '\n' cur_r, cur_g, cur_b = 0,0,0 color = [[Pixle(0,0,0) for i in range(m)] for i in range(n)] for i in range(n): for j in range(m): tmp = input() if len(tmp) == 4: color[i][j].r = int(tmp[1] + tmp[1], 16) color[i][j].g = int(tmp[2] + tmp[2], 16) color[i][j].b = int(tmp[3] + tmp[3], 16) elif len(tmp) == 2: t = int(tmp[1] + tmp[1], 16) color[i][j].r = t color[i][j].g = t color[i][j].b = t else: color[i][j].r = int(tmp[1:3], 16) color[i][j].g = int(tmp[3:5], 16) color[i][j].b = int(tmp[5:7], 16) w = m//p # sub-block wide h = n//q # sub-block high color_block = [[0 for i in range(w)] for i in range(h)] # color block for i in range(h): for j in range(w): r = g = b = 0 for k in range(q): # q * p block for l in range(p): r += color[i * q + k][j * p + l].r g += color[i * q + k][j * p + l].g b += color[i * q + k][j * p + l].b color_block[i][j] = Pixle(r // (p*q), g // (p*q), b // (p*q)) # average rst = [] # result list for i in range(h): for j in range(w): block = color_block[i][j] r,g,b = block.r, block.g, block.b if r == cur_r and g == cur_g and b == cur_b: pass elif r == 0 and g == 0 and b == 0: cur_r, cur_g, cur_b = 0, 0, 0 #reset current color rst.append(esc) rst.append(a_0) rst.append(a_m) else: tmp_r, tmp_g, tmp_b = [], [], [] cur_r, cur_g, cur_b = r, g, b for _ in str(r): tmp_r.append('\\'+hex(ord(_))[1:]) # ascii code for _ in str(g): tmp_g.append('\\'+hex(ord(_))[1:]) for _ in str(b): tmp_b.append('\\'+hex(ord(_))[1:]) r,g,b = ''.join(tmp_r),''.join(tmp_g),''.join(tmp_b) rst.append(esc) rst.append(a_48) rst.append(r) rst.append(a_chr) rst.append(g) rst.append(a_chr) rst.append(b) rst.append(a_m) rst.append(a_space) # insert space if cur_r != 0 or cur_g != 0 or cur_b != 0: # current color is not default color rst.append(esc) rst.append(a_0) rst.append(a_m) cur_r, cur_g, cur_b = 0, 0, 0 # reset rst.append(a_n) # insert '\n' rst_str = "".join(rst) # get string print(rst_str, end='') # no line feed