Если массив статический, значит он непрерывен в памяти, и к нему можно применить любой известный тебе алгоритм перестановок для одномерного массива. Если это динамический двумерный массив, то просто создай одномерный, последовательно скопируй туда все значения и переставляй.
#include
#include
using namespace std;
int main() {
int a[2][2] = { { 0, 1 }, { 1, 0 } };
int sz = sizeof(a) / sizeof(a[0][0]);
sort(&a[0][0], &a[0][0] + sz);
do {
for (int r = 0; r < 2; ++r) {
for (int c = 0; c < 2; ++c) cout << ' ' << a[r][c];
cout << endl;
}
cout << endl;
} while ( next_permutation(&a[0][0], &a[0][0] + sz) );
return 0;
}
Реализацию алгоритма перестановок можешь подсмотреть в функции next_permutation стандартной библиотеки шаблонов, если конечно сможешь разобраться.