Могу ли я найти вектор векторов символов, чтобы найти определенный символ и получить его координаты? - PullRequest
0 голосов
/ 18 мая 2019

У меня есть карта комнаты, которую я поместил в вектор векторов символов (вектор>).Карта будет выглядеть примерно так:

# * #
* * D
S * #

, где # - стены, * - области пути, S - начало, а D - конец.Я не буду знать, как карта выглядит раньше времени, поэтому я хочу, чтобы моя программа могла читать любую карту с характеристиками, аналогичными приведенным выше.

Таким образом, я хотел бы иметь возможность искать свой векторвекторов, чтобы найти координаты / местоположение S, так что я знаю, где находится начальная точка лабиринта.Мне удалось найти примеры только для одного вектора (одномерного).Можно ли это сделать с вектором векторов (двумерным)?Если так, как я могу это сделать?

Вот код, который я использовал для создания матрицы:

vector<vector<char>> GetMap(int& M, int& N) //function to get the map of a room
{
    vector<vector<char>> matrix{}; //give a matrix
    char char_buf;

    for (int rows = 0; rows < M; rows++)
    {
        matrix.push_back(vector<char>()); //Put a new empty row in your matrix
        for (int cols = 0; cols < N; cols++)
        {
            cin >> char_buf; //Here we get a char from cin
            matrix.back().push_back(char_buf); //That you push back in your sub-vector
        }
    }

    return matrix;
}

1 Ответ

0 голосов
/ 18 мая 2019

Прежде всего, ваша функция GetMap постоянно отталкивает новые элементы.Это большая нет, нет, если у вас уже есть размер матрицы, доступной для вас (M и N).Кроме того, на самом деле нет необходимости, чтобы параметры размера имели тип int&.Простое int прекрасно и в большинстве случаев даже более эффективно.

Правило большого пальца: используйте ссылки только для неосновных типов, таких как vector, string и почти для всех классов.

Кроме того, тот факт, что вы используете int&, а не const int&, не позволяет вам вызывать функцию, передавая значения rvalue (переменные без имен).Например GetMap(5, 5).

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

Полный рабочий код с некоторыми улучшениями:

#include <iostream>
#include <vector>

using namespace std;

struct Pos{
    Pos()             : x(0), y(0) {}
    Pos(int x, int y) : x(x), y(y) {}

    int x;
    int y;
};

vector<vector<char>> GetMap(const int height, const int width) //function to get the map of a room
{
    //Create the matrix with the constructor (much more efficent than constantly push_back'ing elements)
    vector<vector<char>> matrix(height, vector<char>(width));

    //Go through every single char in the matrix
    for (int rows = 0; rows < height; rows++)
    {
        for (int cols = 0; cols < width; cols++)
        {
            cin >> matrix[rows][cols];
        }
    }

    return matrix;
}

Pos getElementPos(const vector<vector<char>>& matrix, const char toFind)
{
    int height = matrix.size();
    int width  = matrix[0].size();

    //Go through every single char in the matrix
    for (int rows = 0; rows < height; rows++)
    {
        for (int cols = 0; cols < width; cols++)
        {
           if(matrix[rows][cols] == toFind){
               return Pos(cols, rows);
           }
        }
    }

    // In the event that we couldn't find the element
    return Pos(-1, -1);
}

int main(){
    vector<vector<char>> map = GetMap(5, 5);

    Pos dPos = getElementPos(map, 'D');

    cout << "\nThe coordinates of D are " << dPos.x << " and " << dPos.y << '\n';

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...