распределить количество нулей в любом месте сетки

0

У меня квадрат 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 ноль (конц).

  • 2
    Возможно, вы захотите прочитать ссылку на std::random_shuffle .
  • 0
    std::random_shuffle ничего не возвращает
Показать ещё 1 комментарий
Теги:
arrays
vector

4 ответа

1

Вы можете использовать такой массив:

arr[LINES*COLUMNS] 

и вместо

arr[i][j]

доступ к нему как

arr[i*COLUMNS+j]

Используя этот подход, все линейно, если вы хотите, чтобы это поведение было перетасовано...

ОБНОВИТЬ

как Йоахим Пилеборг предложил... Узнайте больше о random_shufle...

0
//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;
}
  • 0
    @ Джордж Этот инкапсулированный подход может сохранить ваше представление о данных ... здесь написано как pairx. Это ссылка на ваш комментарий ниже о тасовании больше, чем вы хотели.
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;
}
  • 0
    Хм, он работает, но shuffle не работает так, как ожидалось. Я хочу вернуть один элемент из arr, но он может вернуть, например, «1 1», которого нет в arr! Также я имею в виду, что на 10 нулей я хотите добавить в сетку 10 нулей и затем перемешать вектор.
  • 0
    @ Джордж Что не работает? Используйте правильное начальное значение
Показать ещё 6 комментариев
0
//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
            }
  • 0
    : Я хочу заполнить массив нулями "конц". Например, 10 нулями.
  • 0
    @ Джордж, что ты имеешь в виду под десятью нулями? Вы хотите сказать, что в матричной grid должно быть ровно десять нулей?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню