跳到主要内容

名古屋大学 情報学研究科 知能システム学専攻 2025年8月実施 プログラミング

Author

祭音Myyura

Description

出典:名古屋大学公式問題

整数を要素とする 2 次元配列を扱う Python プログラムについて考える。2 ページ目以降に掲載のプログラムは、7~42 行目の関数 proc を呼び出して配列に対して処理を行う。プログラム中の変数 A は 2 次元配列を扱う変数である。プログラム中の変数 T は整数がキーで 1 次元配列を値にとる辞書型の変数である。35 行目の関数呼び出しが初めて実行された際に標準出力に表示される内容は以下のようであった。以下の問い(問 1~5)に答えよ。ただし,A と T の内容を答える際は以下の標準出力例にならって答えること。

A=
[1, 0, 2, 0]
[2, 5, 1, 0]
[0, 0, 0, 9]
[2, 0, 4, 0]
[6, 1, 8, 3]
T={0: [0, -1, 0], 1: [1, -1, 1], 2: [2, -1, 2]}

問1

46~49 行目は以下の処理をプログラムとして実装したものである(← は右辺から左辺への値の代入を表す)。空欄 ア~オ に最も当てはまるコードを下記の選択肢の中から選び,その番号をそれぞれ答えよ。

pu ←  T[u][0]    if T[u][0] - T[v][0] < 0
T[v][0] otherwise

pv ← T[u][0] if T[u][0] - T[v][0] >= 0
T[v][0] otherwise

選択肢

(1) T[u][0] < T[v][0]     (2) T[u][0] < 0        (3) T[v][0] > 0        (4) pu
(5) pv (6) pu, pv (7) T[u][0] (8) T[v][0]
(9) T[u][0], T[v][0] (10) T[v][0], T[u][0]

問2

行目の関数呼び出しが 2 度目に実行された時,標準出力に表示される A と T の内容を答えよ。

問3

行目の関数呼び出しが実行された時,標準出力に表示される A と T の内容を答えよ。

問4

行目に指定されている条件の False を True に変更してプログラムを実行する。42 行目の関数呼び出しが実行された時,標準出力に表示される A の内容を答えよ。

問5

問 4 の変更に加え,24~29 行目をコメントアウトしてプログラムを実行する。42 行目の関数呼び出しが実行された時,標準出力に表示される A と T の内容を答えよ。

プログラム

def display(A, T):
print("A=")
for j in range(len(A)):
print(A[j])
print("T={}".format(T))

def proc(A, T):
m = 1
J = len(A)
I = len(A[0])
for j in range(J):
for i in range(I):
a1 = A[j][i-1] if i > 0 else 0
a2 = A[j-1][i-1] if j > 0 and i > 0 else 0
a3 = A[j-1][i] if j > 0 else 0
a4 = A[j-1][i+1] if j > 0 and i < I - 1 else 0
if A[j][i] != 0:
if a3 != 0:
A[j][i] = a3
elif a1 != 0:
A[j][i] = a1
if a4 != 0:
update(T, a1, a4)
elif a2 != 0:
A[j][i] = a2
if a4 != 0:
update(T, a2, a4)
elif a4 != 0:
A[j][i] = a4
else:
A[j][i] = m
T[m] = [m, -1, m]
m = m + 1

display(A, T)

if False:
for j in range(J):
for i in range(I):
A[j][i] = T[A[j][i]][0]

display(A, T)

def update(T, u, v):
if T[u][0] != T[v][0]:
if ア:
イ = ウ
else:
エ = オ

T[T[pu][2]][1] = pv
T[pu][2] = T[pv][2]
while pv != -1:
T[pv][0] = T[pu][0]
pv = T[pv][1]

A = [[3, 0, 1, 0],
[2, 5, 1, 0],
[0, 0, 0, 9],
[2, 0, 4, 0],
[6, 1, 8, 3]]
T = {0: [0, -1, 0]}

proc(A, T)

题目描述

考虑上文完整 Python 程序。二维整数数组 Aproc 扫描处理;字典 T 以整数为键、三元素一维数组为值,用于维护标签等价类。第一次执行第 35 行 display(A,T) 时的输出已在题面给出。

  1. 第 46—49 行实现题面给出的 pupv 条件赋值。从十个选项中分别为ア—オ选择正确编号。
  2. 写出第 35 行第二次执行时输出的 AT
  3. 写出执行第 42 行显示调用时的 AT
  4. 把第 37 行条件从 False 改为 True,写出执行第 42 行时的 A
  5. 在第 4 问修改基础上再注释第 24—29 行,写出执行第 42 行时的 AT

回答 AT 时须遵循题面所示标准输出格式。

Kai

問1

ア:1
イ:6
ウ:9
エ:6
オ:10

問2

A=
[1, 0, 2, 0]
[1, 1, 2, 0]
[0, 0, 0, 9]
[2, 0, 4, 0]
[6, 1, 8, 3]
T={0: [0, -1, 0], 1: [1, 2, 2], 2: [1, -1, 2]}

問3

A=
[1, 0, 2, 0]
[1, 1, 2, 0]
[0, 0, 0, 2]
[3, 0, 2, 0]
[3, 3, 2, 2]
T={0: [0, -1, 0], 1: [1, 2, 3], 2: [1, 3, 2], 3: [1, -1, 3]}

問4

A=
[1, 0, 1, 0]
[1, 1, 1, 0]
[0, 0, 0, 1]
[1, 0, 1, 0]
[1, 1, 1, 1]

問5

A=
[1, 0, 1, 0]
[1, 1, 1, 0]
[0, 0, 0, 3]
[4, 0, 4, 0]
[4, 4, 4, 4]
T={0: [0, -1, 0], 1: [1, 2, 2], 2: [1, -1, 2], 3: [3, -1, 3], 4: [4, 5, 5], 5: [4, -1, 5]}