Я пытаюсь создать 2D-массив 80×20, который создает 6 линий, которые случайно связаны между двумя точками по периметру массива. Я полагаю, что это будет выглядеть как картинка, созданная только в некоторых местах. Моя проблема в том, что я не знаю, как выбрать и связать две случайные точки по периметру массива и отобразить их. Я сделал код, выбирающий совершенно случайные точки, но не могу решить эту задачу. Может ли кто-нибудь указать мне правильное направление?
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
const int rows = 80; //declares the amount of rows in the 2d array
const int cols = 20; //declares the amount of columns in the 2d array
char sky[rows][cols];
fill_n(&sky[0][0], 100, '-');
fill_n(&sky[0][0] + 100, rows*cols - 100, ' ');
random_shuffle(&sky[0][0], &sky[0][0] + rows*cols);
for(int r = 0; r < rows; ++r)
{
for(int c = 0; c < cols; ++c)
cout << sky[r][c];
cout << " ";
}
return 0;
}
Визуализируйте ваш массив следующим образом в упрощенном примере
[0][0], [0][1], [0][2], [0][3]
[1][0], [1][1], [1][2], [1][3]
[2][0], [2][1], [2][2], [2][3]
[3][0], [3][1], [3][2], [3][3]
Вы можете видеть, что ваши индексы периметра будут первым и последним строками, а также первым и последним столбцами. Я оставлю реализацию вам, но вы сможете использовать это подмножество вашего 2D-массива, чтобы выбрать значения, которые вы хотите соединить.
Удачи в вашем назначении!
Если я правильно читаю ваше описание, вы хотите сделать что-то вроде этого (псевдокод):
for i in 1..6
{ pick one of four sides of the rectangle at random
pick a random point p1 on that side
pick one of the other three sides at random
pick a random point p2 on that side
use a line drawing algorithm (like Bresenham) to connect p1 and p2
}
Начиная с алгоритма, который заполняет массив и случайным образом перемешивает его, вероятно, будет …. неэффективным …. хотя, как показывает аргумент, в конечном итоге одна из случайных перестановок найдет то, что вы хотите …