2016-03-16 2 views
-2

Я пытаюсь прочитать лабиринт (от input.txt) и решить его. Этот код не работает должным образом. Что не так?Лабиринт Решение с рекурсией C++

void Maze::create(vector<vector<int> >&info) 
{ 
for (int i = 1; (unsigned)i < info.size(); i++) 
{ 
    for (int j = 0; (unsigned)j < info[i].size(); j++) 
    { 
     if (info[i][j] == wall) 
     { 
      map[i - 1][j] = block; 
     } 
     else if (info[i][j] == path) 
     { 
      map[i - 1][j] == ' '; 
     } 
     else if (info[i][j] == start) 
     { 
      map[i - 1][j] = 'S'; 
      startingX = (i - 1); 
      startingY = j; 
     } 
     else if (info[i][j] == end) 
     { 
      map[i - 1][j] = 'E'; 
      endingX = (i - 1); 
      endingY = j; 
     } 
     else if (info[i][j]>=bonus) 
     { 
      map[i - 1][j] = 'B'; 
     } 
    } 
} 
print(); 
cout << endl; 
if (solve(startingX, startingY)) 
{ 
    print(); 
} 
else 
{ 
    cout << "DAMN" << endl; 
} 

} 

выше функция, в которой я прочитал входной файл под названием «Информация» и перевести в лабиринте под названием «карта».

bool Maze::solve(int a, int b) 
{ 

    map[b][a] = road; 
    cout << "yes"<<endl; 
    if (a == endingX&&b == endingY) 
    { 
     cout << "yes1" << endl; 
     return true; 
    } 
    else if (a > 0 && map[b][a - 1] ==free && solve((a - 1), b)) 
    { 
     cout << "yes2" << endl; 
     return true; 
    } 
    else if (a < map[0].size() && map[b][a + 1] == free&& solve((a + 1), b)) 
    { 
     cout << "yes3" << endl; 
     return true; 
    } 
    else if (b > 0 && map[b - 1][a] == free && solve(a, (b - 1))) 
    { 
     cout << "yes4" << endl; 
     return true; 
    } 
    else if (b < map.size() && map[b + 1][a] == free && solve(a, (b + 1))) 
    { 
     cout << "yes5" << endl; 
     return true; 
    } 
    map[b][a] == free; 
    //print(); 
    return false; 
} 

и это мой решающий код. Я пытаюсь использовать рекурсивный метод, но кажется, что он не работает, а просто показывает только начальную точку.

+6

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

+0

в 'Maze :: create'' map [i - 1] [j] == ''; 'должно быть' map [i - 1] [j] = ''; ' – Jonas

+3

Вы также, кажется, используете сравнение -for-равенства, когда вы хотите использовать назначение. И вы делаете это * везде *. Это, конечно, не очень хорошо работает, и компилятор должен был дать вам предупреждения об этом (заявления или выражения без эффекта или аналогичные). Если вы не получите предупреждения, вам нужно включить дополнительные предупреждения компилятором. Предупреждения хороши, он рассказывает вам о вещах, которые на самом деле не нарушают правила, но могут быть неправильными другими способами. –

ответ

4

1) Позаботьтесь, чтобы не путать задание и проверку равенства:

  • в вашем создании функции, второй вариант: map[i - 1][j] == ' ';
  • в ваших решить функции, в нижней части: map[b][a] == free;

Таким образом, данные не сохраняются в map. Тест равенства только возвращает false и отбрасывает это логическое значение.

2) Кроме того, я не вижу никаких деклараций/инициализации map, startingX и т. Д. Но так как вы не упоминаете ошибки компиляции, я думаю, вы просто не копировали их в SO.

В заключение, я уверен, ваши проблемы возникли из-за первой проблемы.

2

1) использовать значение X в качестве первой координаты в Maze::create() и в призыве Maze::solve() но вторая координата в Maze::solve()

2), когда вы пишете, в Maze::solve(), if (a < map[0].size() && map[b][a + 1] == free&& solve((a + 1), b)), вы можете написать в a+1 где a+1 == map[0].size(); a+1 должно быть меньше размера

Смежные вопросы