У меня квадрат 2dvector (grid), и я хочу вставить в него число ("conc") нулей. Затем перетасуйте вектор, чтобы распределить нули. (пусть вектор сетки - размер 10x10).
1) Я попробовал:
int conc=1;
for (size_t i=0, max=conc; i!=max;i++){
grid.erase(grid.begin()+1);
for (size_t j=0,max=grid.size();j!=max; j++)
grid[i][j]=0;
}
random_shuffle(grid.begin(),grid.end());
Проблема в том, что с вышеизложенным я получаю 10 нулей (размер сетки = 10x10) вместо 1 (прямо сейчас conc = 1, поэтому я хочу 1 ноль).
И эти десять нулей находятся в одной строке. Я хочу распределить количество нулей в любой точке сетки.
Я хочу вставить 1 ноль (конц).
Вы можете использовать такой массив:
arr[LINES*COLUMNS]
и вместо
arr[i][j]
доступ к нему как
arr[i*COLUMNS+j]
Используя этот подход, все линейно, если вы хотите, чтобы это поведение было перетасовано...
ОБНОВИТЬ
как Йоахим Пилеборг предложил... Узнайте больше о random_shufle...
//I do not want to violate your constraints and
//if you are willing to encapsulate something
//we can let the compiler deal with size observations about an old fashioned array
struct pairx
{
int d[2];
};
int a_test_200()
{
pairx x{{4,3}};//notice more braces ..used only for explanation to human
//also consider std::vector if your constraints permit
pairx arrp[]={ { {0,1}},{ {1,0}}, { {0,-1}}, { {-1,0} } };
cout << "original" << endl;
for (const auto & e : arrp) cout << e.d[0] << " " << e.d[1] << ", ";
cout << endl;
//we assume you shuffle opaque structure pairx
random_shuffle(begin(arrp), end(arrp));
cout << "shuffle" << endl;
for (const auto & e : arrp) cout << e.d[0] << " " << e.d[1] << ", ";
cout << endl;
return 0;
}
std::random_shuffle
ничего не возвращает
Вы должны просто отобразить матрицу после использования алгоритма
random_shuffle(&arr[0][0], &arr[0][0] + sizeof(arr)/sizeof(arr[0][0]));
for(std::size_t i = 0; i < 4; ++i)
{
for(std::size_t j = 0; j < 2; ++j)
std::cout << arr[i][j] << " ";
std::cout << std::endl;
}
//is this what you intended
int conc=10;
for (size_t i=0, max=grid.size(); i!=max;i++){
for (size_t j=0,max=grid.size();j!=max; j++)
grid[i][j]=conc;//change here
}
grid
должно быть ровно десять нулей?
std::random_shuffle
.std::random_shuffle
ничего не возвращает