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
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~