
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ランキング
-
2の補数を計算するプログラム
-
16bitで乱数を生成する方法
-
3のつく数と3の倍数を表示 C言語
-
OpenCVによる4値化について
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
既定のコンストラクタがありま...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
a^2の√=a が成り立たない場合
-
VB6.0での小数点の扱いについて
-
配列をnビットシフトする
-
数学 一次関数 関数 y=-3/4x+k(...
-
c languageで 簡単な質問があ...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
プログラムでの数字につく”f”の...
-
C言語で複数列のデータを1列の...
-
c言語で、繰り返し文の中で、0....
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で簡単なパックマンゲーム...
-
2の補数を計算するプログラム
-
c言語プログラミングについて f...
-
再起呼び出しの回数をカウント...
-
intとlongは同じ?
-
openCVの画像処理について
-
C言語
-
【C#】SQL文の中に変数を埋め込...
-
C言語プログラミング 漸化式に...
-
カードシャッフルのブログラム...
-
C++ Debug Errorについて教えて
-
デバッグビルドとリリースビル...
-
迷路を脱出する経路探索プログ...
-
C++デバックエラーについて詳し...
-
C++ bmp 透過処理
-
複数の共有メモリの作成
-
C言語で%を使わない余りの出し方
-
C言語
-
2次関数プログラムを描写する...
-
16bitで乱数を生成する方法
おすすめ情報