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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

579閲覧

pushが一回しかされない

German_p0tat0

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/17 13:24

C

1int main(void){ 2 int map[ROW][COL]; 3 int i, j, si, sj, gi, gj, found = 0; 4 int run = 1; 5 readMap(map, ROW); 6 si = 1; 7 sj = 1; 8 gi = 8; 9 gj = 10; 10 11 push(si); 12 push(sj); 13 14 while(!isStackEmpty() || found != 1){ 15 j = pop(); 16 i = pop(); 17 if (map[i][j] == map[gi][gj]){ 18 found = 1; 19 }else if (map[i][j] != WALL){ 20 push(i+1); 21 push(j); 22 push(i); 23 push(j+1); 24 } 25 run++; 26 printStack();           /*途中経過を知るためにここの時の各変数を結果に表示した*/ 27 printf("%d,%d,%d\n",i,j,run); 28 } 29 30 if(found == 1){ 31 printf("ゴールまでの経路あり\n"); 32 }else{ 33 printf("ゴールまでの経路なし\n"); 34 } 35 36 return 0; 37}

今迷路の探索のプログラムを書いているのですが、コンパイルして迷路を読み込むとどれも「ゴールまでの経路あり」とでます。これは13行目の終了条件の左側(スタックが空なら真の関数)にひっかかって、1回でループが終わってしまうからだと思います。関数は省略してます。

結果:STACK[]
1,1,1 (i,j,run,runがループ回数)
ゴールまでの経路あり

ここで問題なのがなんでpushされないのかです。i,jは1が入っているからpush(i+1)などしたのに結果のSTACK[]は何も入っていません。
なぜだかわかりますか?

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

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

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

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

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

cateye

2020/05/17 14:06 編集

よく分からないのですが、push(),pop()の本体は何処ですか? “関数は省略してます。”では分かりません・・・
German_p0tat0

2020/05/17 14:08

すみません説明不足でスタックの値を入れるやつと出すやつです。 あと、解決しました。15行目が違ってました。 ありがとうございました。
cateye

2020/05/17 14:15

自己解決→https://teratail.com/help#resolve-myself
thkana

2020/05/17 23:30

質問のコードでは15行目は j = pop(); ですが、これが違っていたのですか?
guest

回答1

0

まず、簡単な例で実行できるようにしましょう。
例えば、1x3の迷路を作り、真ん中に壁を置いて絶対に到達できない迷路とか…

さて、printStackはループの回数だけ呼び出されるのに、1回しかループしないのはおかしくありませんか?
迷路の大きさは8x10と思われますので、1歩でゴールということはありません

if(map[i][j] == map[gi][gj]) がゴールに着いたか、を示しているようですが、
mapの中身が壁か通路かを表すとしたら、スタートもゴールも必ず通路ですから必ずtrueでしょう

さらに、移動できるのは右、下の2方向しかありませんが、
Sの字のように、上や左に移動しないとクリアできない迷路に対応してないように見えます。
これを考えると、右、左、右、左というループが発生しますので、
一度通った場所は探索から外すという処理が必要になります。

投稿2020/05/17 14:15

izmktr

総合スコア2856

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

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

Zuishin

2020/05/17 14:42

else if で 4 回 push されているので、1 回しかループしないということはないんじゃないでしょうか。
Zuishin

2020/05/17 14:57

ああ、飲み込めました。一回しかループしないのはなぜかという質問に一回しかループしないのはおかしくないかと尋ねていたわけですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問