a746: 画蛇添足
这篇教学会示范 ZeroJudge 基础题库“a746: 画蛇添足”的解题过程。
题目需求
题目会先提供 n 和 m 两个数字,n 表示一个 nxn 的矩阵,m 表示矩阵上会出现几个点,接着会依序出现这些点的“座标”,根据座标使用“*”进行连线。
题目链接:a746: 画蛇添足
举例来说,如果提供五组座标分别是 (1, 1)、(1, 4)、(4, 4)、(4, 1)、(1, 1),连线后的长相就会如下图。
解答
这题的重点在于“座标系统”,_必须将题目提供的座标,对应到程序里的二维串列_,开始的时候先建立一个空的二维串列 ( 内容项目都是一个空白字元 ),接着将对应座标的项目填入“*”,最后再透过 for 循环的方式,计算串列两个数值中间是否要补上“*”。
注意,题目会有奇怪的空白,读取到时会发生错误,要使用判断式避开。
while True:
try:
s = input() # 獲取輸入的字串
if s == '' or s == ' ': continue # 如果是空白就先略過
n, m = map(int, s.split()) # 取得 n 和 m 的數字
output = [] # 建立輸出的空串列
for i in range(n):
output.append([]) # 根據矩陣大小,讓串列的第一層數量 ( y 軸 )
for i in range(n):
for j in range(n):
output[i].append(' ') # 根據矩陣大小,讓串列的第二層數量 ( x 軸 ),預設一個空白字元
arr_x, arr_y = [], [] # 建立記錄 x 和 y 的座標串列,預設為空串列
for i in range(m):
# 根據題目輸入的資料,x 和 y 記錄到串列中 ( 注意 y 和 x 的順序 )
y, x = map(lambda i: int(i)-1, input().split())
arr_x.append(x)
arr_y.append(y)
for i in range(m):
if i == 0:
output[arr_y[i]][arr_x[i]] = '*' # 如果是第一個點,直接存入一個星號
else:
# 第二個點開始,計算和第一個點之間的距離
xx = arr_x[i] - arr_x[i-1] # x 的間距 ( 中間差幾個項目 )
yy = arr_y[i] - arr_y[i-1] # y 的間距 ( 中間差幾個項目 )
if yy > 0:
for j in range(abs(yy)):
output[arr_y[i-1]+j+1][arr_x[i]] = '*' # 根據間距,將星號依序放入中間的項目
if yy < 0:
for j in range(abs(yy)):
output[arr_y[i-1]-j-1][arr_x[i]] = '*' # 根據間距,將星號依序放入中間的項目
if xx > 0:
for j in range(abs(xx)):
output[arr_y[i]][arr_x[i-1]+j+1] = '*' # 根據間距,將星號依序放入中間的項目
if xx < 0:
for j in range(abs(xx)):
output[arr_y[i]][arr_x[i-1]-j-1] = '*' # 根據間距,將星號依序放入中間的項目
print('-'*(n+2)) # 根據矩陣大小,上方放上橫線 ( 長度多出 2 )
for i in output:
o = ''.join(i)
print('|' + o + '|') # 根據矩陣大小,左右上橫線
print('-'*(n+2)) # 根據矩陣大小,下方放上橫線 ( 長度多出 2 )
except:
break
微信扫码关注
抖音扫码关注