csp字符画c语言,CCF CSP 2019-3 字符画 80分(超时,又瞧不起python囧)

2ad0a902f7bf46da931a8a0cd3dc678c.png

7fa35f4c14df0c42799880cb0a33e3a0.png

eae37f1fd6be6a529a4f7d0c095c98f2.png

题目分析:

题目很长,读懂之后就很简单。描述里面还有一点混淆视听,前景色在本体里面是用不到的,色块怎么前景色的嘛。

题目大概意思就是:将图片切割成小图片,每个小图片用一个色块块,色块的颜色取小图片内所有像素的均值(向下取整),按他的编码输出。

空格代表色块,对应的字符串表示其颜色, 每一行最后需要一个换行符

色块颜色和默认背景色相同,则使用默认背景色的命令

色块颜色与当前的背景色相同,且不使用换背景色的命令(直接添加‘ ’)

每行色块扫描完成后,将背景色重置为默认颜色

输出的字符使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值