Errore nella sottoposizione in "La camera dei cestini"

Link problema: CMSocial - a social coding app

Chiede di scrivere 3 funzioni per risolverlo, ho usato il file allegato insieme al problema come base per scrivere la mia soluzione, non capisco perchè mi da sempre compilazione fallita, ho sbagliato qualcosa?

#define MAXN  100005
int Mat[MAXN][MAXN]={-1};
int V[MAXN]={-1};
void inizia(int N, int M) {
	int i;
	for(i=0;i<N;i++){
		Mat[0][i]=i;
	}
	int j;
	V[0]=N-1;
}

void sposta(int a, int b) {
	Mat[b][++V[b]]=Mat[a][V[a]--];
	Mat[b][V[b]]=-1;
}

int controlla(int a, int i) {
	if(Mat[a][i]!=-1) return Mat[a][i];
    return -1;
}

Non so perché training non dia nessun errore durante la compilazione, ma in locale il compilatore restituisce questo errore:

g++ grader.cpp cestini2.cpp -Wall -Wpedantic -Wextra
cestini2.cpp:2:19: error: size of array 'Mat' is too large
 int Mat[MAXN][MAXN]={-1};

Ossia che l’array Mat è troppo grande per essere allocato in memoria (circa 40 GB).
Il compilatore di CMS invece prova a inizializzarlo ugualmente e crasha perché oltrepassa il limite di 512 MB per la compilazione. Credo si tratti di un bug da risolvere.
Inoltre stai attento a come inizializzi la matrice, quel codice non funziona come ti aspetteresti.
È spiegato in questo post su StackOverflow:

Using the syntax that you used,

int array[100] = {-1};

says “set the first element to -1 and the rest to 0” since all omitted elements are set to 0.

1 Mi Piace

Grazie, tuttavia ora non capisco come potrei dichiarare una matrice. Non posso dichiararla dentro la funzione perchè altrimenti non potrei utilizzarla al di fuori di essa. Come variabile globale mi da l’errore “variably modified at ‘Mat’ at file scope”, perciò non posso dichiararla usando delle variabili. Non so come allocare memoria dinamicamente ad una matrice, penso tornerò in futuro su questo problema

Infatti non devi allocare quella matrice, né potresti: occuperebbe 40 GB.
La soluzione per allocare lo spazio in modo dinamico è usare il vector della standard library (in questo caso un array di vector). Infatti non avrai mai bisogno di tutta la matrice contemporanteamente, puoi lasciare che il vettore gestisca l’allocazione e la liberazione di memoria per te senza problemi.

1 Mi Piace

ok grazie, proverò