Ошибка в коде С++
В коде, который должен искать наикратчайший путь из лабиринта по движению человека внутри лабиринта, мне встретилась ошибка в функции, которую я не могу понять как решить. Могут ли знающие подсказать? Вот код:
#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.
prog.cpp:9:5: error: ‘laby2’ was not declared in this scope
laby2[x][y]=std::min(n,laby2[x][y]);У функции нет "доступа" к переменной, поскольку она определена локально в функции main
PS: Зачем идти на олимпиаду по программированию без начальных знаний?