Будем жить, Маэстро...
Сообщения: 6694
Благодарности: 1393
|
Профиль
|
Сайт
|
Отправить PM
| Цитировать
Найди выход из лабиринта, можно всегда если использовать правило правой руки( кажется так это называется). Тоесть, прикоснувшись правовй рукой к стене и не отрывая руки идти вперёд, если выход из лабиринта есть, то к нему выйдешь обязательно, если же пространство замкнутое\тупик, то вернёшься к тому месту, откуда начал шествие. Другими словами, нужно проверять наличие стены( #) справа, если символ равен # это стена, если же . то проход. Я решал подобную задачу года три назад, и по-дилетантски, решил только пол задачи, ту часть, где производится обход лабиринта, но часть, которая печатает по порядку путь, заменяя точки . на * решить не смог. Если кто подскажет идеей, как это сделать, думаю, сделаю, не люблю незаконченые дела оставлять.  В функции printSteep пытался сделать вывод каждого шага, но не получилось, сделал только вывод координат.
Код: 
// Программа Прохождения лабиринта
#include <windows.h>
#include <iostream>
using namespace std;
const int row = 12;
const int column = 12;
// Функция перекодировки символов русского языка
char* Rus(const char* text);
char bufRus[256];
char* Rus(const char* text)
{
CharToOem(text, bufRus);
return bufRus;
}
// Функция Прохождения лабиринта
void mazeTraverse(char lab[][column], int rw, int clm, int xx, int yy, int steep);
// Печать пошагового прохождения
void printSteep(char lab[][column], int rw, int clm, int xx, int yy);
int main()
{
char labirint[row][column] = { {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
{'#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '#'},
{'.', '.', '#', '.', '#', '.', '#', '#', '#', '#', '.', '#'},
{'#', '#', '#', '.', '#', '.', '.', '.', '.', '#', '.', '#'},
{'#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '.'},
{'#', '#', '#', '#', '.', '#', '.', '#', '.', '#', '.', '#'},
{'#', '.', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#'},
{'#', '#', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#'},
{'#', '.', '.', '.', '.', '.', '.', '.', '.', '#', '.', '#'},
{'#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '.', '#'},
{'#', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '#'},
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'} };
int x = 2,
y = 0,
steep = 1,
z;
cout<<Rus(" Введите '0' для продолжения или '-1' для финиша : ");
cin>>z;
while(z != -1){
mazeTraverse(labirint, row, column, x, y, steep);
cout<<Rus("\n\n Введите '0' для продолжения или '-1' для финиша : ");
cin>>z;
}
return 0;
}
// Функция прохождения лабиринта
void mazeTraverse(char lab[][column], int rw, int cl, int x, int y, int steep)
{
printSteep(lab, rw, cl, x, y);
if(lab[x][y] == '.' && (x == 4 && y == 11))
return;
// steep - 1 - движение вниз и проверка вправо на наличие стены
else if(steep == 1){
if(lab[x + 1][y] == '.' && lab[x + 1][y - 1] == '#'){ // вперёд - справа стена
x++;
steep = 1;
}
else if(lab[x + 1][y] == '.' && lab[x + 1][y - 1] == '.'){ // угол - поворот направо
x++;
steep = 2;
}
else if(lab[x + 1][y] == '#' && lab[x + 1][y - 1] == '#') // глухой угол - поворот налево
steep = 4;
}
// steep - 2 - движение влево и проверка вправо вверх на наличие стены
else if(steep == 2){
if(lab[x][y - 1] == '.' && lab[x - 1][y - 1] == '#'){
y--;
steep = 2;
}
else if(lab[x][y - 1] == '.' && lab[x - 1][y - 1] == '.'){
y--;
steep = 3;
}
else if(lab[x][y - 1] == '#' && lab[x - 1][y - 1] == '#')
steep = 1;
}
// steep - 3 - движение вверх и проверка вправо вверх на наличие стены
else if(steep == 3){
if(lab[x - 1][y] == '.' && lab[x - 1][y + 1] == '#'){
x--;
steep = 3;
}
else if(lab[x - 1][y] == '.' && lab[x - 1][y + 1] == '.'){
x--;
steep = 4;
}
else if(lab[x - 1][y] == '#' && lab[x - 1][y + 1] == '#')
steep = 2;
}
// steep - 4 - движение вправо и проверка вправо вниз на наличие стены
else if(steep == 4){
if(lab[x][y + 1] == '.' && lab[x + 1][y + 1] == '#'){
y++;
steep = 4;
}
else if(lab[x][y + 1] == '.' && lab[x + 1][y + 1] == '.'){
y++;
steep = 1;
}
else if(lab[x][y + 1] == '#' && lab[x + 1][y + 1] == '#')
steep = 3;
}
mazeTraverse(lab, rw, cl, x, y, steep);
}
// Функция печать шага прохождения
void printSteep(char lab[][column], int rw, int cl, int x, int y)
{
int i = 0,
j = 0;
cout<<endl;
cout<<" X = "<<x<<endl;
cout<<" Y = "<<y<<endl;
for(i = 0; i < rw; i++){
for(j = 0; j < cl; j++){
// if(x != i && y != j) // Так пытался реализовать отметку шага
cout<<lab[i][j];
// if(x == i && y == j) // Так пытался реализовать отметку шага
// cout<<'*'; // Так пытался реализовать отметку шага
}
cout<<endl;
}
}
//---------------------------------------------------------------------------
|