$array = [[2, 2, 1, 1, 1, 1, 1],
[2, 1, 2, 1, 1, 1, 1],
[2, 1, 1, 2, 1, 1, 1]];
char abc[] = new char[]{'1','2','3','4'};//множество допустимых символов
int size = 7;//кол-во элементов
int arr[] = new int[size];//массив для хранения текущего варианта множества
outer: while(true){//вечный цикл
//вывод варианта множества на экран
for(int ndx : arr){
System.out.print(abc[ndx]);
}
System.out.println();
int i = size - 1;//ставим курсов в самую правую ячейку
while(arr[i] == abc.length - 1){//движемся влево, если ячейка переполнена
arr[i] = 0;//записываем в ячейку 0, т.к. идет перенос разряда
i--;//сдвиг влево
//если перенос влево невозможен, значит перебор закончен
if(i < 0)break outer;
}
arr[i]++;//увеличиваем значение ячейки на единицу
}
char s[8],stat[4];
int i,j,k;
s[7]='\0';
for(i=0;i<16384;i++){
k=i;
for(j=0;j<4;j++) stat[j]=0;
for(j=0;j<7;j++){
stat[k%4]++;
s[j]=(char)((k%4)+'1');
k/=4;
}
if((stat[0]>=2)+(stat[1]>=2)+(stat[2]>=2)+(stat[3]>=2)>=2) printf("%s\n",s);
}