Неужели существует человек который нашел выход из этого мега лабиринта? Во всяком случае на его прохождение потребуется очень много времени, невероятной усидчивости и внимания…
Еще на тему
Я не буду пытаться!!!
он то будет думать, что лабиринт типа как в журналах, на одной печатной странице, а я ему вывалю лист А2 с этой головоломкой)
Любой лабиринт (если это не тупик) имеет два и только два варианта прохода: двигаться, придерживаясь левой стены, или двигаться, придерживаясь правой стены. Оба варианта непременно приведут к выходу.
Гораздо более интересны многомерные лабиринты. Это то, что ни один мозг не в силах пройти.
"Вдоль левой стены" и "вдоль правой стены" две стратегии, гарантирующие успех, и если у лабиринта более одного вариант прохода, они дадут различные пути. Но могут быть другие варианты.
Вот например.
если это соблюдено, то каким бы извилистым он не был, стена нигде не прерывается и приведет в итоге к выходу.
Но это может занять на порядок больше времени, чем даже случайное блуждание. Зато гарантировано.
Стены не соединены.
на прохождение алгоритм элементарен. (все время двигаться по одной стороне лабиринта)
В TES даггерфоле было нечто подобное, причем трехмерное. И это потрясало воображение. Ничего подобного ни в одной другой игре не встречалось. Геймдевы берегут слабую психику игроков.
зы: ну не работает у меня зпт
всё получилось, проход есть, но сюда заливать наверное не буду, потому что полученный цветной пнг весит 100МБ.
А вот уменьшенное в 10 раз
pss Извините за тавтологию
у меня на всякий пожарный валяется реализация такого http://algolist.manual.ru/games/maze.php
когда ковырял поиск пути, использовал этот алгоритм
#include // int16_t
#include
#include
#include "image.h"
#include "imagePNG.h"
#define path "mazes/004.png"
#define sizeInside 4
#define sizeWall 2
#define sizePlace (sizeInside + sizeWall)
#define mazeWeightMax (65535)
int mazeW = 0;
int mazeH = 0;
void drawSquare(Image &image, int x, int y, int w, int h);
int maze[400][400][3];
void initMaze()
{
int x,y;
for (y = 0; mazeH > y; ++y)
{
for (x = 0; mazeW > x; ++x)
{
maze[y][x][0] = 0;
maze[y][x][1] = 0;
maze[y][x][2] = mazeWeightMax;
}
}
}
void fillMaze(Image &image)
{
int x, y;
for (y = 0; mazeH > y; ++y)
{
for (x = 0; mazeW > x; ++x)
{
maze[y][x][0] = (image.bitmap[image.size.w * 4 * (sizePlace * y + 0 ) + 4 * (sizePlace * x + sizeWall) + 0]) == 255;
maze[y][x][1] = (image.bitmap[image.size.w * 4 * (sizePlace * y + sizeWall) + 4 * (sizePlace * x ) + 0]) == 255;
maze[y][x][2] = mazeWeightMax;
// maze[y][x][1] = ([image.size.w * 4 * (y + 0) + 4 * (x + 0)]);
}
}
maze[0][0][0] = 0;
maze[0][0][1] = 0;
}
bool wallPass(int y, int x, int direction);
std::vector > result;
int checkRightResolve(int y, int x);
void processMaze()
{
std::cout > wave;
std::stack > waveNew;
std::stack > waveClear;
wave.push(std::pair(0,0));
// maze[0][0][3] = 0;
std::cout p = wave.top();
wave.pop();
y = p.first;
x = p.second;
std::cout step + 1)
{
waveNew.push(std::pair(y - 1, x));
}
}
if (wallPass(y, x, 1))
{
if (maze[y][x-1][2] > step + 1)
{
waveNew.push(std::pair(y, x - 1));
}
}
if (wallPass(y, x, 2))
{
if (maze[y+1][x][2] > step + 1)
{
waveNew.push(std::pair(y + 1, x));
}
}
if (wallPass(y, x, 3))
{
if (maze[y][x + 1][2] > step + 1)
{
waveNew.push(std::pair(y, x + 1));
}
}
}
wave = waveNew;
waveNew = waveClear;
++step;
} while (!wave.empty());
if (maze[mazeH-1][mazeW-1][2] == mazeWeightMax)
{
std::cout (y-1,x+0));
--y;
continue;
}
if (checkRightResolve(y+1, x+0) == step && wallPass(y,x,2))
{
result.push_back(std::pair(y+1,x+0));
++y;
continue;
}
if (checkRightResolve(y-0, x-1) == step && wallPass(y,x,1))
{
result.push_back(std::pair(y-0,x-1));
--x;
continue;
}
if (checkRightResolve(y-0, x+1) == step && wallPass(y,x,3))
{
result.push_back(std::pair(y-0,x+1));
++x;
continue;
}
}
}
}
}
int checkRightResolve(int y, int x)
{
if (y = mazeW || y >= mazeH)
{
return mazeWeightMax;
}
return maze[y][x][2];
}
void drawMaze()
{
std::cout y; ++y)
// for (y = 0; 10 > y; ++y)
{
for (x = 0; mazeW > x; ++x)
// for (x = 0; 10 > x; ++x)
{
std::cout x; ++x)
// for (x = 0; 10 > x; ++x)
{
std::cout = 400 || y >= 400)
{
return false;
}
switch (direction)
{
case 0: // top
// std::cout y; ++y)
{
for (x = 0; image.size.w > x; ++x)
{
std::cout i; ++i)
{
std::cout i; ++i)
{
x = result[i].second;
y = result[i].first;
if (x = mazeW || y>=mazeH)
{
continue;
}
drawSquare(image, x, y, sizeInside, sizeInside);
// image.bitmap[image.size.w * 4 * ((y) * sizePlace +sizeWall+sizeInside/2 ) + 4 * ((x)*sizePlace+sizeWall+sizeInside/2) + 0] = 255;
// image.bitmap[image.size.w * 4 * ((y) * sizePlace +sizeWall+sizeInside/2 ) + 4 * ((x)*sizePlace+sizeWall+sizeInside/2) + 1] = 0;
// image.bitmap[image.size.w * 4 * ((y) * sizePlace +sizeWall+sizeInside/2 ) + 4 * ((x)*sizePlace+sizeWall+sizeInside/2) + 2] = 0;
// image.bitmap[image.size.w * 4 * ((y) * sizePlace +sizeWall+sizeInside/2 ) + 4 * ((x)*sizePlace+sizeWall+sizeInside/2) + 3] = 255;
}
// image.writeToFile("result.png", ImageFileFormat_PNG);
imagePNGWriteToFile("result.png", image.size.w, image.size.h, image.bitmap, 0);
}
}
}
std::cout yy; ++yy)
{
for (int xx = 0; w > xx; ++xx)
{
image.bitmap[image.size.w * 4 * ((y) * sizePlace +sizeWall +yy) + 4 * ((x)*sizePlace+sizeWall+xx) + 0] = 255;
image.bitmap[image.size.w * 4 * ((y) * sizePlace +sizeWall +yy) + 4 * ((x)*sizePlace+sizeWall+xx) + 1] = 200;
image.bitmap[image.size.w * 4 * ((y) * sizePlace +sizeWall +yy) + 4 * ((x)*sizePlace+sizeWall+xx) + 2] = 0;
image.bitmap[image.size.w * 4 * ((y) * sizePlace +sizeWall +yy) + 4 * ((x)*sizePlace+sizeWall+xx) + 3] = 255;
}
}
}