2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【電脳少女 プログラミング2088 Aランク】 新都心のハイウェイ Python3による

Posted at

概要

↓こちらに参加し、といた中で現時点で長期間悩むこととなったものです
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)

スクリーンショット 2025-02-09 230103.png

感想

最初、実行時間内に終わらなくてタイムオーバーを何回もしてしまった。
最終的にチェックする量を減らしたことで何とかなったが、そのためにほぼ二倍の量のコードを書いているのでとてもめんどくさかった。
また、コードのレビューAIがしてくれるのっては面白い。
あと、記事書くって難しい。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?