概要
↓こちらに参加し、といた中で現時点で長期間悩むこととなったものです
https://paiza.jp/entry/denno2088_qiita
コーディング経験
小学校時代にWin7を与えられてVSBを少しかじる。
高校時代にPythonをやりはじめ、競ぷろなどに参加を始める。
大学で情報系の学部に進む ← 今ここ
アプローチ
最初は、すべてのマスにおいて左右上下をちぇえくして、空いているマスなら最初の地点から何回目に来れるかを記録する作業を行わせ続け、更新が終わったらループから抜け出すという仕組みを考えていたが、実行してみたら、タイムオーバーとなったため、一度行った場所をリスト化し、そこから更新していくという形に直した。
コード
x,y = map(int,input().split())
m = []
b = []
t = []
l = []
w = []
m.append([-1 for i in range(y+2)])
t.append([-1 for i in range(y+2)])
for i in range(x):
s = list(input())
if "B" in s:
l.append([i+1,s.index("B")+1])
if "A" in s:
w.append([i+1,s.index("A")+1])
b.append(s)
s = [9999999 if s[i] == "." else s[i] for i in range(y)]
s = [-1 if s[i] == "#" else s[i] for i in range(y)]
r = [9999999 if s[i] == "A" else s[i] for i in range(y)]
r = [0 if r[i] == 'B' else r[i] for i in range(y)]
s = [0 if s[i] == "A" else s[i] for i in range(y)]
s = [9999999 if s[i] == "B" else s[i] for i in range(y)]
m.append([-1]+s+[-1])
t.append([-1]+r+[-1])
m.append([-1 for i in range(y+2)])
t.append([-1 for i in range(y+2)])
s = -1
while True:
s = s + 1
if t[l[s][0]][l[s][1]] == 0:
if 9999999 == t[l[s][0]][l[s][1]+1]:
t[l[s][0]][l[s][1]+1] = 1
l.append([l[s][0],l[s][1]+1])
if 9999999 == t[l[s][0]+1][l[s][1]]:
t[l[s][0]+1][l[s][1]] = 2
l.append([l[s][0]+1,l[s][1]])
if 9999999 == t[l[s][0]][l[s][1]-1]:
t[l[s][0]][l[s][1]-1] = 1
l.append([l[s][0],l[s][1]-1])
if 9999999 == t[l[s][0]-1][l[s][1]]:
t[l[s][0]-1][l[s][1]] = 2
l.append([l[s][0]-1,l[s][1]])
elif t[l[s][0]][l[s][1]] == 1:
if 9999999 == t[l[s][0]][l[s][1]-1]:
t[l[s][0]][l[s][1]-1] = 1
l.append([l[s][0],l[s][1]-1])
if 9999999 == t[l[s][0]][l[s][1]+1]:
t[l[s][0]][l[s][1]+1] = 1
l.append([l[s][0],l[s][1]+1])
elif t[l[s][0]][l[s][1]] == 2:
if 9999999 == t[l[s][0]-1][l[s][1]]:
t[l[s][0]-1][l[s][1]] = 2
l.append([l[s][0]-1,l[s][1]])
if 9999999 == t[l[s][0]+1][l[s][1]]:
t[l[s][0]+1][l[s][1]] = 2
l.append([l[s][0]+1,l[s][1]])
if len(l) - 1 == s:
break
s = -1
while True:
s = s + 1
r = m[w[s][0]][w[s][1]]
if r >= 0:
if r + 1 < m[w[s][0]][w[s][1]+1]:
m[w[s][0]][w[s][1]+1] = r + 1
w.append([w[s][0],w[s][1]+1])
if r + 1 < m[w[s][0]+1][w[s][1]]:
m[w[s][0]+1][w[s][1]] = r + 1
w.append([w[s][0]+1,w[s][1]])
if r + 1 < m[w[s][0]][w[s][1]-1]:
m[w[s][0]][w[s][1]-1] = r + 1
w.append([w[s][0],w[s][1]-1])
if r + 1 < m[w[s][0]-1][w[s][1]]:
m[w[s][0]-1][w[s][1]] = r + 1
w.append([w[s][0]-1,w[s][1]])
if len(w) - 1 == s:
break
li = []
for i in l:
li.append(m[i[0]][i[1]])
if len(li) == 0 or min(li) == 9999999:
print(-1)
else:
print(min(li))
レイミレビュー(ナルシストVer)
感想
最初、実行時間内に終わらなくてタイムオーバーを何回もしてしまった。
最終的にチェックする量を減らしたことで何とかなったが、そのためにほぼ二倍の量のコードを書いているのでとてもめんどくさかった。
また、コードのレビューAIがしてくれるのっては面白い。
あと、記事書くって難しい。