
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- その他(趣味・アウトドア・車) Arudino nanoが正常に動作しない原因 1 2022/10/30 18:29
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- 工学 1つのタクトスイッチで複数の並列回路を閉じ、アースにつなげることができるスイッチはありますか。 2 2022/08/06 10:38
- C言語・C++・C# 参考にいろいろとc言語、c++言語プログラミングでレジストリーを操作したいのですが、無料配布のc++ 3 2022/12/22 01:49
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(プログラミング・Web制作) ドローのソフト 薦めてください 6 2023/07/21 09:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語でコマンドラインの引数に...
-
C++で表を作成したいのです ...
-
2次関数プログラムを描写する...
-
DXライブラリによるパズルゲー...
-
ヒストグラム均等化処理プログラム
-
コマンドプロンプトのウィンド...
-
| (or) を使った関数の引数の作...
-
3のつく数と3の倍数を表示 C言語
-
C言語で簡単なパックマンゲーム...
-
異なるn個の整数からr個の整数...
-
分数の足し算をさせるプログラ...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
数字以外が入力されたらエラー...
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
fgetsなどのときのstdinのバッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報