Как я понимаю этот альгоритм
Здравствуйте, я нашел этот алгоритм для решения лабиринтов, но я не понимаю, что такое "перемещение по лабиринту". Может ли кто-нибудь мне это объяснить?
Спасибо.
Входные данные выглядят примерно так:
#.########### #.#.........# #.###.#.###.# #...#.#...#.# #.#########.# #...........# #######.##### #.......#.#.# ###.#.###.#.# #...#...#...# #####.#####.# #.........#.# ###########.# ---- #.############### #.......#...#...# #.###.###.#####.# #.#.#...........# ###.###.###.###.# #.#.......#...#.# #.#.############# #...........#...# ###.###.###.#.### #.#.#.....#.....# #.#.###.###.#.#.# #...#.....#.#.#.# ###.#.###.#.##### #.#.#...#.#.....# #.###.###.###.#.# #.......#.#...#.# ###############.# ---- #.############### #.......#...#...# #.###.###.#####.# #.#.#.....#.....# ###.###.###.###.# #.#.......#...#.# #.#.#######.###.# #...........#...# ###.###.#####.### #.#.#.....#.....# #.#.###.###.#.#.# #...#.....#.#.#.# ###.#.###.#.##### #.#.#...#.#.....# #.#.#.###.###.#.# #.......#.#...#.# ###############.#
Что я уже пробовал:
#include <stdio.h> int width; int height; int X; int Y; char maze[200][200]; /* # stands for walls . stands for ways o stands for out found path */ // WALLS int Wall(int *x, int *y) { return maze[*y][*x] == '#'; } // MOVEMENT DIRECTIONS int Up(int *x, int *y) { if(--(*y) < 0 || Wall(x, y)) { (*y)++; return 0; } return 1; } int Down(int *x, int *y) { if(++(*y) >= height || Wall(x, y)) { (*y)--; return 0; } return 1; } int ToRight(int *x, int *y) { if(++(*x) >= width || Wall(x, y)) { (*x)--; return 0; } return 1; } int ToLeft(int *x, int *y) { if(--(*x) < 0 || Wall(x, y)) { (*x)++; return 0; } return 1; } // MOVING THROUGH THE MAZE int Movement(int x, int y, int direction, int loop) //x&y where we actually are, direction where we came from and loop which loop we are doing { if(loop > 20000) return 0; int i; int oposite_direction = (direction+2)%4; switch(direction) { case 0: if(ToRight(&x, &y) == 0) return 0; break; case 1: if(Up(&x, &y) == 0) return 0; break; case 2: if(ToLeft(&x, &y) == 0) return 0; break; case 3: if(Down(&x, &y) == 0) return 0; break; } if(x == width - 2 && y == height-1) { maze[y][x] = 'o'; return 1; } for(i=0; i<4; ++i) { if(i != oposite_direction) { if(Movement(x, y, i, loop+1)) { maze[y][x] = 'o'; switch(direction) { case 0: ToLeft(&x, &y); break; case 1: Down(&x, &y); break; case 2: ToRight(&x, &y); break; case 3: Up(&x, &y); break; } return 1; } } } return 0; } int main() { while(1) { for(Y=0; Y<=200; ++Y) { scanf("%s",maze[Y]); if(maze[Y][0] == '-' || maze[Y][0] == '\0') break; } height = width = Y; if(Movement(1,-1,3,0) == 0) { printf("There is no path out of this maze\n"); printf("----\n"); continue; } for(Y=0; Y<height; ++Y) { printf("%s",maze[Y]); printf("\n"); } if ((maze[Y][0] != '\0')) printf("----\n"); if(maze[Y][0] == '\0') break; } return 0; }