Ответы

Ошибка в коде С++

В коде, который должен искать наикратчайший путь из лабиринта по движению человека внутри лабиринта, мне встретилась ошибка в функции, которую я не могу понять как решить. Могут ли знающие подсказать? Вот код:

#include <iostream>

#include <climits>

//Определение дальности любой точки лабиринта функцией

void way(int x,int y,int n){

laby2[x][y]=std::min(n,laby2[x][y]);

if(laby[x][y].find('N') != std::string::npos){

laby[x][y].erase(laby[x][y].find('N'),1);

laby[x][y-1].erase(laby[x][y-1].find('S'),1);

way(x,y-1,n+1);

}

if(laby[x][y].find('E') != std::string::npos){

laby[x][y].erase(laby[x][y].find('E'),1);

laby[x+1][y].erase(laby[x+1][y].find('W'),1);

way(x+1,y,n+1);

}

if(laby[x][y].find('S') != std::string::npos){

laby[x][y].erase(laby[x][y].find('S'),1);

laby[x][y+1].erase(laby[x][y+1].find('N'),1);

way(x,y+1,n+1);

}

if(laby[x][y].find('W') != std::string::npos){

laby[x][y].erase(laby[x][y].find('W'),1);

laby[x-1][y].erase(laby[x-1][y].find('E'),1);

way(x-1,y,n+1);

}

}

int main()

{

// определение размера лабиринта

std::string a; char p;

std::cin>>a;

int n,s,w,e; n=0; s=0; w=0; e=0;

for(int i=0; i<a.size(); i++){

p=a[i];

switch(p){

case 'N':

n++;

break;

case 'S':

s++;

break;

case 'W':

w++;

break;

case 'E':

e++;

break;

}

}

int x = std::max(w,e)*2+3;

int y = std::max(s,n)*2+3;

std::string laby[x][y];

int laby2[x][y];

for(int i=0; i < x; i++){

for(int j = 0; j<y; j++){

laby2[i][j] = INT_MAX;

}

}

x=std::max(w,e)+2;

y=std::max(n,s)+2;

laby2[x][y]=0;

// строение проходов

for(int i=0;i<a.size(); i++){

p = a[i];

switch(p){

case 'N':

if(laby[x][y].find(p)== std::string::npos)

laby[x][y]=laby[x][y]+p;

if(laby[x][y-1].find('S')== std::string::npos)

laby[x][y-1]=laby[x][y-1]+'S';

y--;

break;

case 'E':

if(laby[x][y].find(p)== std::string::npos)

laby[x][y]=laby[x][y]+p;

if(laby[x+1][y].find('W')== std::string::npos)

laby[x+1][y]=laby[x+1][y]+'W';

x++;

break;

case 'S':

if(laby[x][y].find(p)== std::string::npos)

laby[x][y]=laby[x][y]+p;

if(laby[x][y+1].find('N')== std::string::npos)

laby[x][y+1]=laby[x][y+1]+'N';

y++;

break;

case 'W':

if(laby[x][y].find(p)== std::string::npos)

laby[x][y]=laby[x][y]+p;

if(laby[x-1][y].find('E') == std::string::npos)

laby[x-1][y]=laby[x-1][y]+'E';

x--;

break;

}

}

// Функция для определения дальности точек лабиринта

way(std::max(w,e)+2, std::max(n,s)+2, 0);

// Путь Тезея обратно

int curnum = laby2[x][y];

while(curnum>0){

if(laby[x][y-1]+1 == curnum){

y--;

std::cout<<"N";

}

else if(laby[x-1][y]+1 == curnum){

x--;

std::cout<<"E";

}

else if(laby[x][y+1]+1 == curnum){

y++;

std::cout<<"S";

}

else if(laby[x+1][y]+1 == curnum){

x++;

std::cout<<"W";

}

curnum--;

}

return 0;

}

Полная задача 0459 Нить Ариадны на ACMP.ru

Напишу ее полный текст ниже:

Тезею из лабиринта Минотавра помог выйти клубок ниток. Вы можете вместо клубка использовать персональный компьютер.

Требуется написать программу, которая вводит маршрут Тезея в лабиринте и находит кратчайший обратный путь, по которому Тезей сможет выйти из лабиринта, не заходя в тупики и не делая петель.

Входные данные

Входной файл INPUT.TXT содержит маршрут Тезея, который представлен строкой, состоящей из букв: N, S, W, E и длиной от 1 до 200.

Буквы означают:

N - один "шаг" на север,
S - один "шаг" на юг,
W - один "шаг" на запад,
E - один "шаг" на восток.

Выходные данные

В выходной файл OUTPUT.TXT записывается аналогично входному файлу найденный обратный путь. Если маршрут неоднозначен, то следует выбирать согласно следующему приоритету: N, E, S, W.

По дате
По рейтингу
Аватар пользователя
Оракул
2мес
12
prog.cpp:9:5: error: ‘laby2’ was not declared in this scope
     laby2[x][y]=std::min(n,laby2[x][y]);

У функции нет "доступа" к переменной, поскольку она определена локально в функции main

PS: Зачем идти на олимпиаду по программированию без начальных знаний?