質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

1096閲覧

AtCoder Beginners Selection の問題を解いていてエラーが出る原因が分からない

tosa123

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2021/09/03 02:07

編集2021/09/03 03:54

AtCoder Beginners Selectionの最後の問題の、ABC086C 「Traveling」の問題をPythonで解いています。

ABC086C 「Traveling」問題リンク

解説等で見かけるような、偶数と奇数の性質に着目するような美しい解きかたではなく、愚直にスタート地点から時間を進めるにつれて現在地点から上下左右に動かして、対象時間時に到着できているかどうかを判定する関数を作って問題をクリアしようとしました。

そして、以下のようなコードをとりあえず書き終わり、コードテストで確認したところ入力例全てをクリアできたので出来たと思い、コードを提出したところ全ての問題評価項目においてRE(実行時エラー)が表示されてしまいました。

愚直に上下左右全ての部分で配列に入れて調べようとしているので、メモリ制限を超えてしまう事や実行時間以内に終わらないという事だったら自分のアルゴリズムが明らかに悪いと理解できるのですが、REで入力例はちゃんと全部できているだけに、while等改めて確認したのですが、やはりどこが間違えてしまっているのか原因が分かりませんでした。

どこが原因でエラーが出るのかご指摘お願いしたいです。

python

1 2N = int(input().rstrip()) 3 4def check(pre_t, t, sx, sy, gx, gy): 5 # 以前の状態から上下左右動かして初期設定する 6 candidate = [[pre_t, sx + 1, sy], [pre_t, sx - 1, sy], [pre_t, sx, sy + 1], [pre_t, sx, sy - 1]] 7 8 # TrueかFalseを返す 9 while True: 10 t2, now_x, now_y = candidate.pop(0) 11 12 # time < tのときまだちゃんと到達できるか調査中の段階なので上下左右再び追加する 13 if t2 < t: 14 candidate.append([t2 + 1, now_x + 1, now_y]) 15 candidate.append([t2 + 1, now_x - 1, now_y]) 16 candidate.append([t2 + 1, now_x, now_y + 1]) 17 candidate.append([t2 + 1, now_x, now_y - 1]) 18 elif t2 == t: 19 if now_x == gx and now_y == gy: 20 return True 21 22 if len(candidate) == 0: 23 return False 24 25# 原点からスタートするための初期設定 26pre_t, sx, sy = 1, 0, 0 27 28for i in range(N): 29 t, gx, gy = map(int, input().rstrip().split(" ")) 30 # もしちゃんとただりつけるのであれば 31 if check(pre_t, t, sx, sy, gx, gy): 32 # 次の準備をする 33 pre_t = t + 1 34 sx = gx 35 sy = gy 36 else: 37 print("No") 38 break 39# 一度もbreakしなかったら成功したという事なので、その時のみ以下の処理をおこなう 40else: 41 print("Yes") 42 43 44 45 46

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

check関数の中で変数名にtimeを使っていますが、これを別の名前に変えてみてください。
おそらくAtCoderのシステムが実行時間測定のためにtimeモジュールをimportしていて衝突しているのだと思います。

投稿2021/09/03 03:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tosa123

2021/09/03 03:48

timeという変数名をとりあえずt2と変えたのですが(上記コード編集済み)、状況は変わりませんでした。
退会済みユーザー

退会済みユーザー

2021/09/03 03:53

提出結果のURLを貼ってもらうことはできますか? 私の方では time => tt に変更することでREではなくTLEになることを確認済です。
tosa123

2021/09/03 04:02

とりあえずログアウトして再び変数名を変えて実行したところ、ちゃんとTLEになりました…。 つぎはTLEにならないコードを書くことを目指そうと思います。 ありがとうございました。
guest

0

詳しく見ていませんが、

最後から2行目のelse:は明らかに間違いです。

投稿2021/09/03 02:50

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tosa123

2021/09/03 02:57

https://python.civic-apps.com/else-loop/ といった記事を参考に、while for で一度もbreakしなかった場合else以下の処理を行うというものを行いました。 また、それでも間違っている可能性もあると考え、flagをたててやる方法で修正したものの、 案の定入力例では正解だったものの、提出では全てRE(実行エラー)で状況は変わりませんでした。
ppaul

2021/09/03 04:54

インデントなしでelse:を書いているのに、エラーは出ませんでしたか?
tosa123

2021/09/03 04:58

はい、でていないです。 他の言語にはあまりないPython独自の機能みたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問