cpp странное поведение в этой функции - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь написать функцию, которая вычисляет эвристический разрыв.Ниже мой код:

#include <iostream>
using namespace std;
#include <vector>
#include <map>
#include <string>
using namespace std;
int main(int argc, char const *argv[])
{
    string direction = "backward";
    string state_string = "012345";
    string goal_state_string = "125430";
    int n = 3;

    string ignored_pancakes;
    int gap = 0;
    state_string += to_string(state_string.length());
    unsigned int goal_state_index;
    goal_state_string += to_string(goal_state_string.length());
    if (direction == "forward")
    {
        for (unsigned int i = 0; i < n; i++)
        {
            ignored_pancakes += goal_state_string[i];
        }
    }
    else
    {
        for (unsigned int i = 0; i < n; i++)
        {
            ignored_pancakes += state_string[i];
        }

    }

    for (int i = 0; i < state_string.length(); i++)
    {

        if ((ignored_pancakes.find(state_string[i + 1]) != string::npos) or (ignored_pancakes.find(state_string.at(i)) != string::npos))
        {
            continue;
        }

        if (abs(goal_state_string.find(state_string[i])-goal_state_string.find(state_string[i+1])!=1)){
            gap++;
        }


        cout << state_string.at(i) << "\t" << state_string.at(i + 1) << endl;
    }
    // cout << state_string << endl;
    cout << ignored_pancakes << endl;
    cout << gap << endl; 
 }

Вывод, который я ожидаю, выглядит следующим образом:

3       4
4       5
5       6
012
2

Но то, что выводится на печать:

3       4
4       5
5       6

Страннокогда я закомментирую строку, которая говорит:

cout << state_string.at(i) << "\t" << state_string.at(i + 1) << endl;

Вывод:

012
2

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

1 Ответ

0 голосов
/ 27 сентября 2018
for (int i = 0; i < state_string.length(); i++)
{
    // ...
    cout << state_string.at(i) << "\t" << state_string.at(i + 1) << endl;
}

С i + 1 вы получаете доступ к строке за пределами.Измените ваш цикл на

for (int i = 0; i < state_string.length() - 1; i++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...