использование getline для ввода в 2D-массив

для одного из моих заданий мне нужно создать 2D-массив с помощью getline. дизайн лабиринта составляется на месте.

16 10
################
#      #    #  #
# # #### ##   ##
# #      #######
# ###### #E    #
#S# #  # ### ### 
# # ## #     # #
# # ## ####### #
#              #
################

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

16 10 — это столбец и ряд нашего лабиринта.

мне было интересно, как я буду правильно анализировать getline, чтобы мой 2D-массив заполнялся с использованием заданного лабиринта.

на заметку, я сделал тренировочный вариант, в котором мне не нужно cin, а вместо этого уже есть мой массив, и мне было интересно, как я могу сказать, чтобы он начинался с S.

извините, если есть вопрос по этому поводу, но я действительно не видел ни одного, где он встраивался в 2D-массив в этом формате, где вы не знаете размер своего массива.


person T.J. Williams    schedule 20.10.2012    source источник
comment
не то же самое, но я верю, что это сработает. в основном то же самое, просто мне нужно установить свои столбцы и строки. ТЮ   -  person T.J. Williams    schedule 21.10.2012
comment
Я немного адаптировал его для вас. Проверьте мой новый ответ здесь.   -  person Geoff Montee    schedule 21.10.2012


Ответы (2)


getline будет читать только одну строку за раз, поэтому вы, вероятно, захотите использовать цикл for для чтения каждой строки по очереди и сохранения ее как одной строки вашего 2d-массива.

person hexist    schedule 20.10.2012

Попробуй это:

size_t num_rows;
size_t num_cols;

cin >> num_rows >> num_cols;

char* maze = new char[num_rows * num_cols];

for (size_t row = 0; row < num_rows; row++)
{
     string line;

     getline(cin, line);

    if (line.size() != num_cols)
    {
        cerr << "Error! Size is " << line.size() << " rather than " << num_cols << endl;
        exit(1);
    }

    for (size_t col = 0; col < num_cols; col++)
    {
        maze[(row * num_cols) + col] = line[col];
    }
}

cout << "Maze is: " << endl;

for(int row = 0; row < num_rows; row++)
{
    for(int col = 0; col < num_cols; col++)
    {
        cout << maze[(row * num_cols) + col];
    }

    cout << endl;
}

delete [] maze;

Чтобы выяснить, где находится начало:

size_t start_row, start_col;

for(int row = 0; row < num_rows; row++)
{
    bool found = false;

    for(int col = 0; col < num_cols; col++)
    {
        if (maze[(row * num_cols) + col] == 'S')
        {
            start_row = row;
            start_col = col;
            found = true;
            break;
        }
    }

    if (found)
    {
        break;
    }
}

Вы можете сделать аналогичные вещи для конечной точки.

Если вы хотите поместить начальную точку в случайное пустое место, вы можете использовать srand и rand.

Во-первых, запустите генератор псевдослучайных чисел в начале вашей программы:

srand(time(0));

Затем определите случайную начальную точку:

size_t start_row, start_col;
bool found = false;

while (!found)
{
    start_row = rand() % num_rows;
    start_col = rand() % num_cols;

    if (isspace(maze[(start_row * num_cols) + start_col]))
    {
        maze[(start_row * num_cols) + start_col] = 'S';
        found = true;
    }
}

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

Люди скажут, что srand и rand не очень хорошо генерируют случайные числа. Это правда, но этого должно быть достаточно для ваших нужд.

person Geoff Montee    schedule 20.10.2012
comment
Я не использую удаление, не так ли? Это только для этого примера? - person T.J. Williams; 21.10.2012
comment
Вы используете delete, когда полностью закончите работу с массивом. - person Geoff Montee; 21.10.2012
comment
Оператор delete действует противоположно оператору new. Вам нужно 1 delete на каждые new. Но вы не вызываете его, пока не закончите с памятью. - person Geoff Montee; 21.10.2012
comment
Я работал над этим и заставил его работать в тестовом лабиринте, где я знаю начальную точку, но я не уверен, как сделать так, чтобы он мог найти случайную начальную точку. Любая идея о том, как повторить и заставить его оставаться на старте? - person T.J. Williams; 21.10.2012
comment
Я не уверен, что вы подразумеваете под итерацией, но оставайтесь в начале. Однако я добавил некоторый код, который должен помочь вам поставить начало в случайном пустом месте. - person Geoff Montee; 21.10.2012