No.3ベストアンサー
- 回答日時:
私も、部活で迷路脱出のプログラムを最近作りました。
そのときには、本を参考に再起処理を使って作りました。一応サンプルプログラムです。
#include<stdio.h>
int meiro[][]={{ 省略 }};
int Si,Sj,Ei,Ej,success,sp,ri[100],rj[100];
int tansaku(int,int);
main()
{
sp=0;
success=0;
Si=1; Sj=1; Ei=7; Ej=7;
printf("\n迷路の探索");
if(tansaku(Si,Sj)==0){
//出口が見つからなかった
}
}
int tansaku(int i,int j)
{
int k;
static int path=1;
meiro[i][j]=1;
ri[sp]=i; rj[sp]=j; sp++;
if(i==Ei && j==Ej){
//出口が見つかった時の処理
//この時点で、ri,rjに経路が記録されている
success=1;
}//全経路検索 一度通ったところは通らない
if(meiro[i][j+1]==0) tansaku(i,j+1);
if(meiro[i+1][j]==0) tansaku(i+1,j);
if(meiro[i][j-1]==0) tansaku(i,j-1);
if(meiro[i-1][j]==0) tansaku(i-1,j);
sp--;
meiro[i][j]=0; //別経路探索のため
return(success);
}
確か本を参考に、こんなプログラムを作ったはずです。
ソースは、学校のパソコンに保存されているので性格かはわかりませんが・・・。
一応再起処理で全経路を検索しますが、広い空間があるとうまくいかないことがありました。
meiro[][]の二次元配列は、0が通路、1が自分が通った通路、2が壁です。
このプログラムは、迷路を壁で囲ってある状態にしていないと無限ループになるので、そこも注意してください。
迷路が大きいと時間がかかってしまうので、途中で中断できるようになればそれなりのものができると思います。
この回答を、投稿の前に確認したところ、字下げしたのがすべて無視されてました。
字下げなしの見にくいプログラムになってしまい、すみません。
No.4
- 回答日時:
趣味で迷路探索ロボット(マイクロマウス)を作っています。
迷路探索アルゴリズムは定番がいくつかありますので、それを紹介します。
(a) 行き当たりバッタリ
- 有限時間でゴールできる保証はない。
- アルゴリズムとはいえないかもしれない。
(b) 幅優先探索
- アルゴリズムの教科書を開くと必ず出てくるやつ。
- やってることは「しらみつぶし」だが、効率的なやりかた。
- すでに探索した区間は探索しない。
(c) 左手法(右手法でも同じ)
- 迷路探索の最も基本。
- 左手を壁に当てたまま進み続ける。
- ループする迷路は抜けられない。
(c') 拡張左手法(左手法の応用)
- 一度通った区画は再び入らない。
- 「仮想壁」がミソ。
(c'') トレモー法
- 拡張左手法を一般化したもの。
(d) 求心法
- ゴールに近ければ近いほど小さい評価値を設定する。
- その評価値が低いほう低い方へたどっていきゴールを目指す。
(e) 足立法
- 迷路探索と最短経路導出を同時にやってしまおうという便利な探索方法。
- 名前の由来は最初にやった人が「足立さん」という方だった、という説が有力。
(f) 等高線法(ポテンシャル法)
- ゴールから迷路全体への歩数マップを作る。
- 現在位置から歩数が小さくなる方向へ移動する。
- 移動中に壁が見つかったら、歩数マップを作り直す。
それぞれを解説するとここでは書ききれませんから、あとはここで出てきたキーワードを元に google 等で検索してみてください。
No.2
- 回答日時:
Cなら通路の分岐点でその関数を呼ぶことにより、行き止まり = ゴールになるまで再帰的にコールしたらどうかなあ?
あとは、すこし改造すれば、自分が通ったブロックをカウントすることにより最短コースも分かるし。
ただ、これは総当たり戦なので遅いですね。
No.1
- 回答日時:
以前、javascriptで簡単な迷路脱出プログラムを書いたことがあります。
参考URLを参照
迷路をどう表現するかで、経路探索も違ってくると思います。
参考URLでの経路探索は、よくある壁に手をついて進むという方針で進むという方法になっています。
参考URL:http://okweb.jp/kotaeru.php3?qid=1143763
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
家の中でのこだわりスペースはどこですか?
自分の家で快適に過ごすために工夫しているスペースはありますか? 例)ベランダでお茶を飲むためのカフェテーブル ゲーミングに特化したこだわりのPCスペース
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
ちょっと先の未来クイズ第4問
11月ごろに発表される、2024年の「新語・流行語大賞」にノミネートされる言葉を書けるだけ書いてください。
-
高校三年生の合唱祭で何を歌いましたか?
大人になると大人数で合唱する機会ってないですよね。 思い出すと、高校三年生の合唱祭が最後でした。 そこで、みんなの思い出の合唱曲を知りたい!
-
迷路の解を見つけるアルゴリズム
C言語・C++・C#
-
数字列を3桁ごとにカンマで区切る方法
C言語・C++・C#
-
再起を使って迷路を解くプログラムを作りたいのですが
C言語・C++・C#
-
-
4
関数から配列を返すには?
C言語・C++・C#
-
5
C言語 配列の長さの上限
C言語・C++・C#
-
6
C言語初心者の質問失礼します。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
カードシャッフルのブログラム...
-
OpenCVによる4値化について
-
C++で表を作成したいのです ...
-
分数の足し算をさせるプログラ...
-
条件が多い場合
-
画像の拡大・縮小
-
ヌメロンのプログラム
-
関数とビット列
-
C++ bmp 透過処理
-
C言語で簡単なパックマンゲーム...
-
コマンドプロンプトのウィンド...
-
3のつく数と3の倍数を表示 C言語
-
異なるn個の整数からr個の整数...
-
迷路を脱出する経路探索プログ...
-
whileとifを使い偶数を出すには
-
再帰処理をループ処理に変換
おすすめ情報