0

私の課題の 1 つで、getline を使用して 2D 配列を作成する必要があります。迷路のデザインはその場で作ります。

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

これは、バックトラッキング アルゴリズムをテストするサンプル入力の 1 つです。

16 10 は、迷路の列と行です。

指定された迷路を使用して 2D 配列がいっぱいになるように、getline を正しく解析する方法を考えていました。

補足として、私は cin を使用する必要がなく、代わりに既にアレイを持っている練習用のものを作成しました。

これについて質問がある場合は申し訳ありませんが、配列サイズがわからないこの形式で 2D 配列に変換されている場所を実際には見ませんでした。

4

2 に答える 2

1

getlineは一度に1行しか読み取らないため、forループを使用して各行を順番に読み取り、2d配列の1行として格納することをお勧めします。

于 2012-10-20T22:33:36.883 に答える
0

Try this:

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;

To figure out where start is:

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;
    }
}

You can do similar things for the end point.

If you want to put the start point at a random empty spot, you can use srand and rand.

First, seed the pseudorandom number generator at the beginning of your program:

srand(time(0));

Then, determine a random start point:

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;
    }
}

You can put the end spot in a random empty spot in a similar way.

People will sy that srand and rand aren't very good at generating random numbers. That is true, but it should be sufficient for your needs.

于 2012-10-20T22:41:37.037 に答える