Se non hai studiato i puntatori e l'operatore di dereferenziazione puoi anche utilizzare la seguente versione della funzione mischia_quadrato():
void mischia_quadrato(unsigned int m[N][N], unsigned int v[N * N], unsigned int n)
{
unsigned int i;
unsigned int a;
unsigned int temp;
for(i = n * n - 1; i > 0; --i)
{
a = rand() % (i + 1);
temp = v[i];
v[i] = v[a];
v[a] = temp;
}
for(i = 0; i < n; ++i)
{
for(unsigned int j = 0; j < n; ++j)
{
m[i][j] = v[i * n + j];
}
}
}