深さ優先探索アルゴリズムを再帰を用いて記述してみたのですが、プロコンサイトでの判定が一部サンプルデータで実行時エラーとなり、スタックオーバーフローが発生しているのではないかと思われます。問題点及び解決方法をご教示いただけると助かります。
###問題
Atcoder Typical Contest 001 A
高橋君の住む街は長方形の形をしており、格子状の区画に区切られています。 長方形の各辺は東西及び南北に並行です。 各区画は道または塀のどちらかであり、高橋君は道を東西南北に移動できますが斜めには移動できません。 また、塀の区画は通ることができません。
高橋君が、塀を壊したりすることなく道を通って魚屋にたどり着けるかどうか判定してください。
[入力]
入力は以下の形式で標準入力から与えられる。
H W
c0,0 c0,1 c0,W−1
c1,0 c1,1 c1,W−1
:
cH−1,0 cH−1,1 cH−1,W−1
1 行目には、街の南北の長さとして整数 H(1≦H≦500) と東西の長さとして整数 W(1≦W≦500) が空白で区切られて与えられる。
2 行目からの H 行には、格子状の街の各区画における状態 ci,j(0≦i≦H−1,0≦j≦W−1) が与えられる。
i 行目 j 文字目の文字 ci,j はそれぞれ s, g, ., # のいずれかで与えられ、座標 (j,i) が下記のような状態であることを表す。
"s" : その区画が家であることを表す。
"g" : その区画が魚屋であることを表す。
"." : その区画が道であることを表す。
"#" : その区画が塀であることを表す。
高橋君は家・魚屋・道は通ることができるが、塀は通ることができない。
与えられた街の外を通ることはできない。
s と g はそれぞれ 1 つずつ与えられる。
[出力]
塀を 1 回も壊さずに、家から魚屋まで辿り着くことができる場合は Yes、辿りつけない場合は No を標準出力に 1 行で出力せよ。
###コード
lang
1import sys 2 3h,w = list(map(int,input().split())) 4M = [list(input()) for _ in range(h)] 5 6for i,j in enumerate(M): 7 if "s" in j: 8 sr,sc = i,j.index("s") 9 10def dfs(r,c): 11 M[r][c] = "#" 12 for i,j in ([-1,0],[1,0],[0,-1],[0,1]): 13 if not (0 <= r+i < h and 0 <= c+j < w): 14 continue 15 if M[r+i][c+j] == "g": 16 print("Yes") 17 sys.exit() 18 if M[r+i][c+j] == ".": 19 dfs(r+i,c+j) 20 21dfs(sr,sc) 22print("No")
###実行結果
コードテスト
Submission #3124726

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/09/02 06:23 編集
2018/09/02 06:56
退会済みユーザー
2018/09/02 07:07