int grid[3500][3500];
Si tu fais ca a l'interieur d'une fonction tu généres un variable tableau de 49Mo (pour des int 32bits) dans la pile qui classiquement fait quelques ko. Donc explosion immediaite du prog.
En C++ pour reserver de la memoire dans le "tas", c'est a dire demander au systeme d'explotation un lot de RAM pour ton prog, il faut utiliser l'operateur "new". Et ensuite rendre (quand on en plus besoin) cette memoire avec "delete". tu déclares dans la pile seulement un pointeur sur cette zone de memoire :
int* p_i; // cree dans la pile un pointeur sur entier
p_i = new int; // reserve dans la memoire systeme la place d'un int et met son adresse dans le pointeur "p_i"
...
delete p_i; // rend la memoire au systeme
Bien sur c'est pas tres utile pour un simple entier de quelques octets c'est a utiliser pour les gros objet.
Pour un tableau c'est "new[]" et "delete[]" :
int* grid = new int[3500*3500]; // attention c'est un tableau a 1 entrée, grid pointe dessus une zone de 49Mo en RAM
...
delete[] grid;