У меня есть двумерный массив. Мне необходимо при выполнении какого-нибудь условия присвоить значение случайному элементу массива. Массив большой, и если написать 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
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
// пока не обработаем все индексы
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'; //замена случайного элемента
}
Комментариев нет:
Отправить комментарий