Как хранить симметрии Полемино, используя указатели на указатели?

Итак, я работаю над кодированием дискретной проблемы листов. Я храню свой объект под названием Полимин вот так:

 pointer = new int*[h];
p_0 = new int*[h];
p_1 = new int*[h];
p_2 = new int*[w];
p_3 = new int*[w];
p_4 = new int*[w];
p_5 = new int*[h];
p_6 = new int*[w];

for (i=0 ; i < h ; i++)
pointer[i] = new int[w];
p_0[i] = new int[w];
p_1[i] = new int[w];
p_5[i]=new int[w];

}
for(i=0 ; i < w ; i++){
p_2[i]=new int[h];
p_3[i]=new int[h];
p_4[i]=new int[h];
p_6[i]=new int[h];
}

for (i=0; i<h ; i++){
for(j=0; j<w ; j++){
cout << "What is the " << i+1;
cout << ", " << j+1;
cout << endl;
cin >> k;
if(k != 0)
pointer[i][j]=1;
else
pointer[i][j]=0;

}}

Затем я генерирую все 8 возможных ориентаций ( группа симметрий площади) и сохраняя их в 7 других двойных указателей. Мне было интересно, есть ли способ сделать массив размером 8, который содержит адрес для каждого из моих двойных указателей.

Если бы я мог сделать это, это сделало бы мою жизнь намного проще, когда я проверял доску на наличие пустых пространств, а затем размещал их.
Я хотел бы что-то вроде:

         orientation[8];
orientation[0]=pointer;
orientation[1]=p_0;
orientation[2]=p_1;
orientation[3]=p_2;
orientation[4]=p_3;

и так далее. Проблема в том, что есть два разных размера; одно существо, а другое существо. Сначала я хотел сделать что-то вроде:

     int** orientation;
orientation = new int*[8]

for(i=0;i<8<;i++)
orientation[i]=new int*[h*w];

Большое спасибо заранее.

1

Решение

Элементы массива хранятся в последовательных местах в памяти, так что вы можете получить адреса и сделать некоторые вычисления на нем, например:

int arr[] = { 0, 1, 2, 3, 4, 5 };
int* a = &arr[0]; // Address of the beginning of the array (i.e index 0)
int* b = a + 3;   // Address of index 3, behind the scene it does a + (3 * sizeof(int))

cout << "index 0 : " << *a << endl;
cout << "index 3 : " << *b << endl << endl;

int d = 0, e = 1, f = 2;
int* arr2[] = { &d, &e, &f }; // Array of pointers
int** address = &arr2[1];     // Pointer to a pointer
int*** address_of_handle = &address; // Address of that pointer
cout << "index 1 : " << ***address_of_handle;

Но кроме знакомства с указателями мне интересно, почему вы хотите это сделать?

0

Другие решения

извините, но он не прав, вы можете запустить ваш массив в 0 или 1, если вы остановили свой массив в точном положении, если вы попытаетесь получить доступ к памяти вне массива, у вас возникнет проблема переполнения alex, вы должны прочитать немного больше C / C ++

0

Вы можете просто объявить массив указателей double с размером 8, как это

double * Arrptr [8];

а затем для хранения адресов вам просто нужно использовать цикл, который может быть циклом for для хранения каждого значения в массиве, но вам придется сохранять один за другим в массиве, это решение будет лучше

double *arrptr[8];
for (int i=1;i<=8;i++)
{
/*generate values getting them from the user or
you can generate them with your method*/

cout << "Enter orientations/n";
cin >> arrptr[i];}
-3
По вопросам рекламы [email protected]