C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: 迷路の問題


(過去ログ 114 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■67385 / inTopicNo.1)  迷路の問題
  
□投稿者/ sun (1回)-(2013/07/29(Mon) 23:14:18)

分類:[C/C++] 

質問です
今幅優先探索を使って迷路の問題を解いているのですが考え方に詰まってしまいました
アドバイスをいただけないでしょうか。

@ 幅優先探索を使って二次元配列を使って定義した架空のマップに自分の座標から歩数を振っていく

A その最短経路をたどってゴールまで辿り着きたい

歩数を振ることができたのでいま最短経路をたどろうとしています。自分の座標からゴールの座標まで
たどろうとすると同じ数値(幅優先探索で振り分けた歩数の数値)があるのでゴールへと向かう正しい
最短経路が判断できないので、逆にゴールの座標から自分の座標へもとめた最短経路をたどりその経路を
同じサイズの別の二次元配列に格納し、その保存した経路をたどりゴールまで行きたいとおもっています。
ですがゴールから自分の座標をたどるということができません。どうやればいいのでしょうか?

厳密に言うとゴールから自分の座標へ求めた最短経路をたどるというのはその経路を保存するために用意した二次元配列に
ゴールから自分の座標へたどり、ゴールから自分の座標へと向かう最短経路をだけを保存ししたいということです。

簡単なイメージ図です。 G=ゴール M(0)=自分の座標 数値=歩数 #=壁
int maze[7][7];
#######
###123#
###M12G(3)
###123#
###234#
#######
#######

int wh_map[7][7];

-1-1-1-1-1-1-1
-1-1-1-1-1-1-1
-1-1-1M 1 2 G(3)←ゴールから自分の座標へ逆算した最短経路(歩数)だけが別の二次元配列に入っている。
-1-1-1-1-1-1-1
-1-1-1-1-1-1-1
-1-1-1-1-1-1-1
-1-1-1-1-1-1-1

回答のほうお願いします。
引用返信 編集キー/
■67388 / inTopicNo.2)  Re[1]: 迷路の問題
□投稿者/ 甕星 (17回)-(2013/07/30(Tue) 16:15:26)
もしかして二次元配列のまま、幅優先探索を適用しようなんて考えてませんか?

幅優先探索は木構造やグラフ構造のデータに対して用いるアルゴリズムです。二次元配列のままでは処理できません。

まずは二次元配列に入っているデータを木構造かグラフ構造のデータに変換して下さい。
その後、幅優先探索によって最適解を求め。
得られた答えをあらためて二次元配列にデータを変換するって事になります。
引用返信 編集キー/
■67392 / inTopicNo.3)  Re[2]: 迷路の問題
□投稿者/ 774RR (97回)-(2013/07/30(Tue) 19:20:03)
幅優先探索で既に解けたのであれば、最初に出てきた経路が最短であるわけだ。

ゴールでの歩数がnなら、「隣接する、歩数がn−1であるマス」を探せば
必然的に迷路を逆にたどることができるはずだ。
スタートにたどり着くとき=歩数が0になるとき、ってことで。
# 正しく解けている前提。

最短経路が1本しかないとき必然的に歩数n−1のマスは1個しかないはずだし、
歩数n−1のマスが複数ある=最短経路が複数あるってことだから、
そのときどうすればよいかは「仕様」による。

引用返信 編集キー/
■67396 / inTopicNo.4)  Re[3]: 迷路の問題
□投稿者/ sun (2回)-(2013/07/31(Wed) 00:02:57)
No67392 (774RR さん) に返信
> 幅優先探索で既に解けたのであれば、最初に出てきた経路が最短であるわけだ。
>
> ゴールでの歩数がnなら、「隣接する、歩数がn−1であるマス」を探せば
> 必然的に迷路を逆にたどることができるはずだ。
> スタートにたどり着くとき=歩数が0になるとき、ってことで。
> # 正しく解けている前提。
>
> 最短経路が1本しかないとき必然的に歩数n−1のマスは1個しかないはずだし、
> 歩数n−1のマスが複数ある=最短経路が複数あるってことだから、
> そのときどうすればよいかは「仕様」による。

すみません。n-1であるマスを探すということがよくイメージできません。for文とif文を使えばいいのでしょうか?
また、n-1のマスを探すといってもゴールから自分の座標までたどるわけですから座標が3→2→1→0のようになるわけですから
n-1ではゴールと隣接している座標の情報は二次元配列に格納できても他の座標の情報がうまく取得できないのではないでしょうか。
引用返信 編集キー/
■67397 / inTopicNo.5)  Re[4]: 迷路の問題
□投稿者/ 774RR (98回)-(2013/07/31(Wed) 05:33:09)
> 座標が3→2→1→0のようになるわけですから
座標でなく歩数だよ。当然ループで繰り返すわけだ。
今注目中のマスの歩数がnであるとき、次に行くべきマスはn−1ってこと。
ループ終了条件は自明だろう。

簡単な3x3迷路を考えるとしよう。□は通れるマスで、■は通れないマスとする。
Sはスタート、Gはゴール(S・Gとも□である)。
幅優先探索で歩数を振ると2番目の図になる。求めたいのは3番目の図のはず。
S□□   012   012
□■G → 1■3 → XX3
□□□   230   XXX

ゴール位置(2,1)は既知であるので、そこからスタートする
(2,1)の歩数3だから、隣接する歩数2のマスを探すと(2,0)だ。
(2,0)の歩数2だから、隣接する歩数1のマスを探すと(1,0)だ。
以下略。

ゴール位置が違うと、最短経路が複数ある場合が生じて
S□□   012
□■□ → 1■3
□□G   234
この場合「経路を1つ求めればいいのか、全部求めるのか」「何を最短とするか」あたりは
自分で決める必要がある(仕様を策定する必要がある)

引用返信 編集キー/
■67403 / inTopicNo.6)  Re[5]: 迷路の問題
□投稿者/ sun (3回)-(2013/07/31(Wed) 18:37:15)
No67397 (774RR さん) に返信
> なるほど。考えてやってみたんですがなぜか経路の座標が表示されません。自分はこれで間違いないとおもっていたのですが何か間違っていることがあるのでしょうか?

	//cnt[70][70]=マップに振った歩数が入っている
	//NX,NY=ゴールの座標のX座標、Y座標の情報が入っている変数

	for (int N=cnt[GoalY][GoalX];N<=0;N--)//Nにゴールの歩数を代入。Nをデクリメント
	{
		if (N-1==cnt[NY-1][NX]) //もしゴールの座標の上にN-1の情報が入っているのなら
		{
			hosu_map[NY-1][NX]=N-1; //同じサイズの別の配列の同じ座標にN-1を代入
			NY--;
		}

		else if (N-1==cnt[NY+1][NX])//もしゴールの座標の下に〃
		{
			hosu_map[NY+1][NX]=N-1;
			NY++;
		}

		else if (N-1==cnt[NY][NX-1])//もしゴールの座標の右に〃
		{
			hosu_map[NY][NX-1]=N-1;
			NX--;
		}

		else if (N-1==cnt[NY][NX+1])//もしゴールの座標の左に〃
		{
			hosu_map[NY][NX+1]=N-1;
			NX++;
		}
	}

	/*NY、NXをデクリメント、インクリメントしているのは上下左右いずれかの座標に歩数を振ったら
	その歩数の振った座標から、またどこにN−1の座標があるか上下左右みなければならないと
	思ったからです。*/

引用返信 編集キー/
■67404 / inTopicNo.7)  Re[6]: 迷路の問題
□投稿者/ Hongliang (74回)-(2013/07/31(Wed) 18:47:24)
> for (int N=cnt[GoalY][GoalX];N<=0;N--)//Nにゴールの歩数を代入。Nをデクリメント
N<=0だと「Nが0以下の間ループ」になりますよ。
引用返信 編集キー/
■67409 / inTopicNo.8)  Re[7]: 迷路の問題
□投稿者/ sun (4回)-(2013/07/31(Wed) 23:10:14)
No67404 (Hongliang さん) に返信
>> for (int N=cnt[GoalY][GoalX];N<=0;N--)//Nにゴールの歩数を代入。Nをデクリメント
> N<=0だと「Nが0以下の間ループ」になりますよ。

ありがとうございます。直したら表示できるようになりました。おかげでようやく完成させることができました。みなさん本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -