Lo que se me ocurrió fue esto:
Código PHP:
void __fastcall TFormPrincipal::ButtonBarajarMatrizClick(TObject *Sender)
{
//En este form pedimos el numero de columnas y filas
FormDimension->ShowModal();
//Obtenemos memoria para nuestro array
v = new int*[filas];
for(int i = 0; i < filas; ++i)
v[i] = new int[columnas];
//En este form rellenamos el array
FormRellenado->ShowModal();
String s;
Memo1->Lines->Clear();
Memo1->Lines->Add("Matriz original");
//Mostramos el array original
for(int f = 0; f < filas; f++) {
s = "";
for(int c = 0; c < columnas; c++)
s = s + String(v[f][c]) +",";
Memo1->Lines->Add(s);
}
Memo1->Lines->Add("");
Memo1->Lines->Add("Matriz modificada");
//Obtengo memoria auxiliar para meter todo el array bidimensional en uno unidimensional
int *array_aux = new int[filas * columnas];
//Relleno el array auxiliar con los datos del array bidimensional
int pos = 0;
for(int f = 0; f < filas; f++) {
for(int c = 0; c < columnas; c++)
{
array_aux[pos] = v[f][c];
pos++;
}
}
//Barajamos los valores del array
random_shuffle(&array_aux[0], &array_aux[filas * columnas]);
//Actualizo el contenido del array bidimensional ya barajado
pos = 0;
for(int f = 0; f < filas; f++) {
for(int c = 0; c < columnas; c++)
{
v[f][c] = array_aux[pos];
pos++;
}
}
//Libero la memoria del array auxiliar
delete [] array_aux;
//Mostramos el array barajado
for(int f = 0; f < filas; f++) {
s = "";
for(int c = 0; c < columnas; c++)
s = s + IntToStr(v[f][c]) +",";
Memo1->Lines->Add(s);
}
//Liberamos la memoria del array
for(int i = 0; i < filas; ++i) {
delete [] v[i];
}
delete [] v;
}
Pero lo ideal sería conseguirlo sin usar un array auxiliar aunque esto funciona correctamente. ¿se te ocurre algo?