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

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

新規登録して質問してみよう
ただいま回答率
85.35%
アルゴリズム

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1481閲覧

AtCoder ABC C問題の幅優先探索について

sikotaro

総合スコア15

アルゴリズム

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/02 00:41

前提・実現したいこと

ABC 007のC問題でBFSについて勉強していたのですが、その途中ででたエラーの原因がわかりません。
問題は以下の通りで、地図とスタートとゴール地点が与えられて最短経路の手数を出力するものです。

1行目には、行数 R(1≦R≦50)と列数 C(1≦C≦50)がそれぞれ空白区切りで与えられる。
2行目には、スタート地点の座標 (sy,sx) が空白区切りで与えられる。スタート地点が sy 行 sx列にあることを意味する。 1≦sy≦R かつ 1≦sx≦C である。
3行目には、ゴール地点の座標 (gy,gx) が空白区切りで与えられる。ゴール地点が gy 行 gx 列にあることを意味する。 1≦gy≦R かつ 1≦gx≦C であり、(gy,gx)!=(sy,sx)であることが保障されている。
4行目から R 行、長さ C の文字列が 1 行ずつ与えられる。各文字は . もしくは # のいずれかあり、i 回目 (1≦i≦R) に与えられられる文字列のうち j 文字目 (1≦j≦C) について、その文字が . なら、マス (i,j) が空きマスであり、# なら、マス (i,j)
が壁マスであることをあらわす。
盤面は壁マスで囲まれている。つまり、i=1,i=R,j=1,j=C のうちいずれか1つでも条件を満たすマス (i,j) について、c(i,j) は #である。また、スタート地点とゴール地点は必ず空きマスであり、スタート地点からゴール地点へは、空きマスを辿って必ずたどり着ける。

発生している問題・エラーメッセージ

出力すると正答が11のところ0となります。 以下のコードでprint(count)とすると、すべて0の二重リストが出力されました。

該当のソースコード

python3

1import queue 2r,c = map(int,input().split()) 3sy,sx = map(int,input().split()) 4gy,gx = map(int,input().split()) 5 6city = [list(input()) for i in range(r)] 7count = [[0]*c for i in range(r)] 8que = queue.Queue() 9dy = [0,1,0,-1] 10dx = [1,0,-1,0] 11 12def course(y,x): 13 que.put([y,x]) 14 p = que.get() 15 if p[0] == gy-1 and p[1] == gx-1: 16 exit() 17 while not que.empty(): 18 for i in range(4): 19 ny = p[0] + dy[i] 20 nx = p[1] + dx[i] 21 if 0 < ny < r and 0 < nx < c and city[ny][nx] == "." and count[ny][nx] == 0: 22 que.put([ny,nx]) 23 count[ny][nx] = count[p[0]][p[1]]+1 24 return count[gx-1][gy-1] 25print(course(sy-1,sx-1))

試したこと

他の方のコードを参考にしたり自分のコードをよく読んだりしましたがなぜ0となるのかがわかりません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

からのキューに要素を1つ入れて、即座に取り出しているため、キューが空の状態でwhileに入ろうとしますが、当然入れません。何も起こらずにcourseを抜けることになるため、countは全部0のままです。

投稿2020/05/02 01:35

swordone

総合スコア20669

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

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

sikotaro

2020/05/03 14:41

なるほど、とても初歩的なミスをしてしまってたんですね ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問