Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Массив в массиве

У меня есть двумерный массив. Мне необходимо при выполнении какого-нибудь условия присвоить значение случайному элементу массива. Массив большой, и если написать arr[rand()][rand()], то программа долго угадывает. С каждым шагом, количество элементов, которые отвечают условию, уменьшается (и в конце, когда остается один элемент, который опять-таки отвечает условию, программа ну прям очень долго его угадывает).
Чтобы реализовать данную проблему я создала новый массив, элементами которого являются элементы ранее созданного массива.
arr1[size] = {arr2[0][0], arr2[0][1], arr2[1][0], arr2[1][1]};
Так вот, мне нужно, чтобы при присвоении значения элементу arr1[0], это же значение было присвоено и массиву arr2[0][0], arr1[0] — arr2[0][1]. Надо, чтобы рандомно изменялись все элементы, кроме тех, что находятся на диагоналях. А у меня получается:
arr1[0] = 5 arr2[0][0] = точно не 5
Как быть? Или есть другой вариант? Динамические массивы еще не проходили.
#include #include
using namespace std;
void main() { srand(time(0)); const int SIZE = 5; char array1[SIZE][SIZE] = { 0 };
// Заполняем массив первоначальными значениями for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (i == j || i == SIZE - j - 1) // Если диагональ { array1[i][j] = '0'; } else array1[i][j] = ' '; } cout << endl; }
// Максимальное количество элементов, что соответствуют размеру 5 char array2[SIZE*3+1] = { 0 }; int k = 0; cout << "Array1
"; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { cout << array1[i][j]; if (i == j || i == SIZE - j - 1) { array2[k] = array1[i][j]; ++k; } } cout << endl; } cout << endl; cout << "Array2
"; int rand_num = rand() % k; array2[rand_num] = 'X'; for (int i = 0; i < k ; i++) { cout << array2[i] << " "; }
cout << endl; cout << "Change array1

";
// Тут ничего не меняется, а мне нужно // чтобы элементу массива array[i][j] присвоилось значение Х for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { cout << array1[i][j]; } cout << endl; } }


Ответ

Если я правильно понял наложенные "ходом обучения" ограничения (нельзя указатели, нельзя функции) то решение может выглядеть так:
пусть двухмерный массив (матрица) - размером NxN сформировать массив индексов ind всех элементов в матрице, кроме диагональных. В этом массиве будет L=N*(N-1) элементов. Для матрицы 3х3: 1 -> m[0][1], 2 -> m[0][2], 3 -> m[1][0], 5 -> m[1][2], 6 -> m[2][0], 7 -> m[2][1]. Обратите внимание: здесь пропущены индексы 0, 4, 8, соответствующие элементам на диагонали. для замены случайного элемента:
взять i=rand(); pos=ind[i] элемент из массива индексов убрать i-й индекс из массива, сдвинув все индексы справа от него на 1 влево и уменьшив L на 1 заменить в матрице элемент m[pos/N][pos%N]
В коде это будет выглядеть примерно так:
int ind[N*(N-1)]; int L = N*(N-1); // заполняем индексы for (int ind_p=0, arr_p=0; arr_p 0 ) ind[ind_p++] = arr_p; }
// пока не обработаем все индексы while ( L != 0 ) { int i = rand() % L; int pos = ind[i]; // индекс в матрице
// удалим индекс из массива --L; for ( ; i < L; ++i) ind[i] = ind[i+1];
if ( uslovie ) // "какое-нибудь условие" matrix[pos/N][pos%N] = 'X'; //замена случайного элемента }

Комментариев нет:

Отправить комментарий