===== 穴掘り法再び(探索もするよ) =====
==== 迷路探索課題 ====
- 迷路作って、表示できる
- 左上と右下にStartとGoalを設置
- 幅優先探索と深さ優先探索で、スタートからゴールまでの道のりを調べる
- (一応ゴールまで行っても全探索しよう)
- ゴールまでの歩数も調べる
穴掘り法、ループできないバージョン(バグとっただけ)
# include // Siv3D v0.6.14
#include
#include
#include
#include
==== BFS(幅優先探索の実装) ====
//const Size BLOCK_SIZE{ 32, 32 };
//const Size MazeSize{ 25, 19 };//サイズは奇数でなければいけない
//const Point Start{ 1,1 };
//const Point Goal{ MazeSize.x - 2,MazeSize.y - 2 };
//
//enum OBJS
//{
// WALL, BAR, FLOOR, START, GOAL, MAX_OBJS
//};
//スタートとゴールのデータをセット
//void SetSG(int w, int h)
//{
// MazeDataForSearch = MazeData; //元データは取っておく
// MazeData[Start.y][Start.x] = START;
// MazeData[Goal.y][Goal.x] = GOAL;
//}
//キューに
std::queue> myQueue;
void BFS()
{
//探索用 ←↑→↓⇒np[0],np[1],np[2],np[3]
Point np[4]{ {0,-1},{1, 0},{0, 1},{-1,0} };
//迷路には0~MAX_OBJS-1のオブジェクトが置かれている
//ので邪魔にならん番号を使っていく
//step - MAX_OBJSが現在の探索ステップ数
int step = MAX_OBJS;
//キュースタート地点とステップ数を記録
myQueue.push({ Start, step });
//スタート地点のステップ数をstepに設定
MazeDataForSearch[Start.y][Start.x] = step;
//探索候補のキューが空ではない間探索を続行
while ( XXXXXXXXXXX )
{
//キューから探索候補をとってくる
//(デキュー:C++の場合は.front()で参照して、必要なくなった.front()を.pop()で廃棄)
std::pair Crr = XXXXXXXXX.XXXXXX();
XXXXXXXXXXX.XXXXXX();
//上のnp[]を使って自分の4近傍を探索
for (int i = 0; i < 4; i++)
{
//上のnp[]を使って自分の4近傍を探索
Point tmp = Crr.first + XXXXXXXXXXXX;
//端っこだったら探索しない
if (XXXXXXXXXXXXXXXXXX)
continue;
//隣がFLOOR(床)だったら進める!(探索候補として隣の位置(tmp.x, tmp.y)をセット)
if (MazeDataForSearch[tmp.y][tmp.x] == XXXXXXX) {
MazeDataForSearch[tmp.y][tmp.x] =XXXX;//ステップを1進めて
myQueue.push({ XXXXXX, XXXXXXXXXXX});//キューに探索候補をセット
}
}
}
}