Создать 2D вектор из ввода в C ++ - PullRequest
0 голосов
/ 12 ноября 2010

быстрый вопрос здесь. Мне интересно, как создать 2D вектор из пользовательского ввода. Для проекта я сохраняю свою «доску» в виде 2D-вектора, и пользователь вводит ее высоту и ширину, а также , возможно, начальную конфигурацию.

Если моя доска хранится как:

vector<vector<int> > myBoard( width, vector<int> (height) ); 
//Not sure how to get width and height from input...

Мне нужно будет инициализировать его по заданным параметрам и (если пользователь предоставит информацию) заполнить доску кусочками. Пользователь будет вводить всю эту информацию в 1 строку, через 1 CIN. Так вот так ...

Please type the board config: 3 3

или

Please type the board config: 3 3 . . . . . . X . O

или

Please type the board config: 3 3 ABFDFL($%$

С последним примером плохого ввода. В первом примере будет создан 2D вектор, 3 на 3. Второй пример создаст 2D вектор, 3 на 3, и заполнит доску заданной позицией. В этом случае, "." 0, «Х» 1, а «О» будет -1. Это та часть, с которой у меня больше всего проблем. Я мог бы сохранить ее в виде строки, но, кажется, что перебор и разбор этого будет болью в заднице ...

Ответы [ 6 ]

2 голосов
/ 12 ноября 2010

Я бы попытался вывести размеры из пользовательского ввода.

Пример сеанса:

A board consists of characters ., X or O.
An example board:
.XO
...
X..

Enter the board, end with two Returns:
.....
..XO.
.XXX.
OOOOO
.....

Затем вы сканируете первую строку, чтобы найти ширину, проверяете каждую строку на наличие допустимых символов и одинаковой ширины и подсчитываете строки, чтобы найти высоту.

1 голос
/ 12 ноября 2010

Разбор уже, ради всего святого!Если все, что вы разрешаете, это «.», «X» и «O», то в основном все, что вам нужно сделать, это пропустить пробел.(Если вы любите своих пользователей, вы можете также разрешить использование строчных букв.)

1 голос
/ 12 ноября 2010

Вы можете использовать карту, где ключом является std :: пара координат доски, считанных из cin как целые числа.Представление значения может быть int или char и легко доступно.Тогда вы могли бы делать такие вещи, как ...

if(board[std::pair(x,y)] == '.')
  //do something;
0 голосов
/ 12 ноября 2010

Вот метод, использующий cin и его механизмы:

#include <stdio.h>
#include <iostream>
#include <vector>
#include <limits>
#include <ctype.h>


using namespace std;


int main(){
    int x;
    int y;
    bool done = false;

    vector< int > inputs;
    char holdValue;


    while ( !done )
    {
        inputs.clear();
        cout << "Enter Data:" << endl; //something more descriptive then then this
        cin >> x >> y;
        if(cin.fail())
        {
            cin.clear();
            cin.ignore( std::numeric_limits<std::streamsize>::max(),'\n' );
            cout << "Error with your input" << endl;
            continue;
        }

        int i = 0;
        bool error = false;
        for ( ;  i < ( x * y ) && error != true ; ++i )
        {
            cin >> holdValue;
            if(cin.fail())
            {
                cin.clear();
                cin.ignore( std::numeric_limits<std::streamsize>::max(),'\n' );
                cout << "Error with your input" << endl;
                error = true;
            }
            switch( toupper( holdValue ) )
            {
                case 'X':
                    inputs.push_back( 1 );
                    break;

                case 'O':
                    inputs.push_back( -1 );
                    break;

                case '.':
                    inputs.push_back( 0 );
                    break;

                default:
                    cin.ignore( std::numeric_limits<std::streamsize>::max(),'\n' );
                    cout << "Error with your input" << endl;
                    error = true;
                    break;
            }
        }

        if( i >= ( x * y )  && error != true )
        {
            done = true;
        }
    }

    //At this piont you have a vector to do with as you please

}

Но для такого количества усилий вы могли бы также прочитать его в std :: string и написать парсер и покончить с этим.Если будет быстрее, и вам будет легче делать то, что вы хотите, если вы неправильно введете данные.

0 голосов
/ 12 ноября 2010

Псевдокод, который, вероятно, приводит к квадратному колесу.

getline( cin, board );  

find location of first space: board.find( ' ' );  
assign this to size_t height  
extract the digit(s) to a sting (or vector?): board.substr( 0, height )  
atoi this string for the height  
cut this from the string: board = board.substr( height )  
repeat for width  
initialize the realBoard vector with width and height  

if board still has chars, start filling the board  
initialize two ints for the vector coordinates  
initialize another for putting numbers onto the board  

until you get to the end of board  
send board[ i ] to a switch  
as you said, o/O = -1; x/X = 1; ./default = 0  
(unless you want bad input to interrupt execution)  
put the value into realBoard[ h ][ w ]  
add one to w;  
if it is above width, make it 0, add one to h  
if h > height, stop this function  
0 голосов
/ 12 ноября 2010

Я мог бы сохранить это в строку, но, кажется, что анализ и его разбор был бы болью в заднице ...

Почему?Это одна if / else цепочка или switch.

. И рано или поздно вам надоест управлять векторами векторов.Я бы поместил всю доску в один вектор и обратился бы к ней y * width + x.Это может даже стать собственным классом в будущем:

Piece board::getPieceAt(int x, int y) const
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...