迷路を解くプログラムについて
迷路を脱出する経路を探索するプログラムを作成したいのですが、
何をすればいいのかまったくわかりません
以下のプログラムはあるんですが、このプログラムを改良していくということなんでしょうか?左上からスタートして右下がゴールらしいのですがやり方教えてください
#include <stdlib.h>
#include <stdio.h>
#include "List.h"
#define LEN 256
int maze[LEN][LEN];
void readMaze(char* filename, int *w, int *h, int maze[LEN][LEN]) {
FILE *fp;
int x, y;
if (0 != fopen_s(&fp, filename, "r")) {
fprintf(stderr, "指定された迷路の入力ファイルを開くことができませんでした.\n");
exit(-1);
}
fscanf_s(fp, "%d,%d\n", w, h);
for (y = 0; y < 2 * *h + 1; y++) {
for (x = 0; x < 2 * *w + 1; x++) {
fscanf_s(fp, "%d%*[^-0-9]", &(maze[y][x]));
}
}
fclose(fp);
}
void writeMaze(char* filename, int w, int h, int maze[LEN][LEN]) {
FILE *fp;
int x, y;
if (0 != fopen_s(&fp, filename, "w")) {
fprintf(stderr, "指定された迷路の出力ファイルを開くことができませんでした.\n");
exit(-1);
}
fprintf_s(fp, "%d,%d\n", w, h);
for (y = 0; y < 2 * h + 1; y++) {
for (x = 0; x < 2 * w + 1; x++) {
fprintf_s(fp, "%d", maze[y][x]);
if (x < 2 * w) {
fprintf_s(fp, ",");
}
else {
fprintf_s(fp, "\n");
}
}
}
fclose(fp);
}
// シンプルなバージョン:なるべく右下へ行けるなら右下へ
int main(int argc, char** argv) {
int w, h;
int x, y;
if (argc < 3) {
fprintf(stderr, "迷路の入出力ファイル名を指定してください.\n");
exit(-1);
}
// 迷路読込
readMaze(argv[1], &w, &h, maze);
// maze[1][1] から maze[2*h-1][2*w-1] までのルートを探す
x = 1; //座標の初期化
y = 1;
while (x != 2 * w - 1 || y != 2 * h - 1){
if (maze[y][x + 1] == 0) { // 右にまだ行ってない?
maze[y][x] = 1000;
x = x + 1;
}
else if (maze[y + 1][x] == 0) { // 下にまだ行ってない?
maze[y][x] = 1000;
y = y + 1;
}
else if (maze[y][x - 1] == 0) { // 左にまだ行ってない?
maze[y][x] = 1000;
x = x - 1;
}
else if (maze[y - 1][x] == 0) { // 上にまだ行ってない?
maze[y][x] = 1000;
y = y - 1;
}
else if (maze[y][x + 1] == 1000) { // 行き止まりなので右に引き返す
maze[y][x] = 1;
x = x + 1;
}
else if (maze[y + 1][x] == 1000) { // 行き止まりなので下に引き返す
maze[y][x] = 1;
y = y + 1;
}
else if (maze[y][x - 1] == 1000) { // 行き止まりなので左に引き返す
maze[y][x] = 1;
x = x - 1;
}
else if (maze[y - 1][x] == 1000) { // 行き止まりなので上に引き返す
maze[y][x] = 1;
y = y - 1;
}
}
maze[2 * h - 1][2 * w - 1] = 1000; // ゴール
// 答えを濃い色に
// 上記のプログラムはすでに答えを濃い色(1000)にしている
// 迷路書出
writeMaze(argv[2], w, h, maze);
return 0;
}
お礼
なるほど。 プール直径は1.3mでマウスにとっては大きいと思っていたのですが、四分画の中央に退避場所(水面下プラットフォーム)があるので、目的(退避場所)と目印の距離は数10cmしかないことになります。その場合、目印の認識が部屋の空間情報に対して優先しても不思議ではないということですね。 アドバイス、ありがとうございました。