#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//definisco una funzione che legge l'input e che restituisce la lunghezza della sequenza
int read_input(int array[]){
int num;
int i=0,j;
bool stop= false;
while(stop==false){
for (j=0; j<i;j++){
if (array[j]==num){
stop=true;
}
}
if (stop==false){
array[i]=num;
i++;
}
}
return i;
}
// definisco una funzione che determina se due sequenze collidono
bool collides(int A[], int B[], int n){
int i;
for (i = 0; i < n; i++) {
if (A[i] == B[i]) {
return true;
}
}
return false;
}
// definisco una funzione che modifica una sequenza per ottenere la prossima permutazione possibile in ordine lessicografico
void next_permutation(int array[], int length){
int i= length -2, j=length -1, temp;
while (array[i]>= array[i+1])
i--;
while (array[j]<=array[i])
j--;
temp=array[i];
array[i]=array[j];
array[j]=temp;
j=length-1;
i++;
while (i<j){
temp=array[i];
array[i]=array[j];
array[j]=temp;
i++;
j--;
}
}
// definisco una funzione che prende in input una sequenza e controlla se non collide con le sequenze già scritte
bool acceptable(int array[],int*matrice, int length ,int n_permutations){
bool accepted=true;
int i;
for (i=0;i<n_permutations;i++){
if (collides(&(matrice[i*length]),array,length)){
accepted=false;
}
}
return accepted;
}
int main(){
int length;
int* array
= (int*)malloc(15*sizeof(int)); length=read_input(array);
// calcolo il numero totale di permutazioni (length!)
int total_permutations=1;
int i,j;
for (i=1;i<=length;i++){
total_permutations *=i;
}
//creo la matrice che conterrà le sequenze richieste
int* matrice
=(int*)malloc(length
*length
*sizeof(int));
//creo la sequenza dei numeri fissi
int* fixed
= (int*)malloc(length
*sizeof(int)); for (i=0;i<length;i++){
fixed[i]=i;
}
//la prima riga della matrice è la sequenza dei numeri fissi, la seconda è la sequenza in input
for (j=0; j<length;j++){
matrice[j]=fixed[j];
matrice[1*length+j]=array[j];
}
//ottengo la matrice con le sequenze richieste
int m=2;
for(i=0; i<total_permutations-1;i++){
next_permutation(fixed,length);
if(acceptable(fixed,matrice,length,m)){
for(j=0; j<length;j++){
matrice[m*length+j]=fixed[j];
}
m++;
}
}
//stampo la matrice con le sequenze richieste
for(i=1; i<m;i++){
printf("%d",matrice
[i
*length
]);
for( j=1; j<length;j++){
printf(" %d",matrice
[i
*length
+j
]); }
}
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+CQovL2RlZmluaXNjbyB1bmEgZnVuemlvbmUgY2hlIGxlZ2dlIGwnaW5wdXQgZSBjaGUgcmVzdGl0dWlzY2UgbGEgbHVuZ2hlenphIGRlbGxhIHNlcXVlbnphCmludCByZWFkX2lucHV0KGludCBhcnJheVtdKXsKCWludCBudW07CglpbnQgaT0wLGo7Cglib29sIHN0b3A9IGZhbHNlOwoJd2hpbGUoc3RvcD09ZmFsc2UpewoJCXNjYW5mKCIlZCIsJm51bSk7CgkJZm9yIChqPTA7IGo8aTtqKyspewoJCQlpZiAoYXJyYXlbal09PW51bSl7CgkJCQlzdG9wPXRydWU7CgkJCX0KCQl9CgkJaWYgKHN0b3A9PWZhbHNlKXsKCQkJYXJyYXlbaV09bnVtOwoJCQlpKys7CgkJfQoJfQoJcmV0dXJuIGk7Cn0KLy8gZGVmaW5pc2NvIHVuYSBmdW56aW9uZSBjaGUgZGV0ZXJtaW5hIHNlIGR1ZSBzZXF1ZW56ZSBjb2xsaWRvbm8gCgpib29sIGNvbGxpZGVzKGludCBBW10sIGludCBCW10sIGludCBuKXsKCWludCBpOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGlmIChBW2ldID09IEJbaV0pIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgovLyBkZWZpbmlzY28gdW5hIGZ1bnppb25lIGNoZSBtb2RpZmljYSB1bmEgc2VxdWVuemEgcGVyIG90dGVuZXJlIGxhIHByb3NzaW1hIHBlcm11dGF6aW9uZSBwb3NzaWJpbGUgaW4gb3JkaW5lIGxlc3NpY29ncmFmaWNvCgp2b2lkIG5leHRfcGVybXV0YXRpb24oaW50IGFycmF5W10sIGludCBsZW5ndGgpewoJaW50IGk9IGxlbmd0aCAtMiwgaj1sZW5ndGggLTEsIHRlbXA7Cgl3aGlsZSAoYXJyYXlbaV0+PSBhcnJheVtpKzFdKQoJaS0tOwoJd2hpbGUgKGFycmF5W2pdPD1hcnJheVtpXSkKCWotLTsKCXRlbXA9YXJyYXlbaV07CglhcnJheVtpXT1hcnJheVtqXTsKCWFycmF5W2pdPXRlbXA7CgkKCWo9bGVuZ3RoLTE7CglpKys7Cgl3aGlsZSAoaTxqKXsKCQl0ZW1wPWFycmF5W2ldOwoJCWFycmF5W2ldPWFycmF5W2pdOwoJCWFycmF5W2pdPXRlbXA7CgkJaSsrOwoJCWotLTsKCX0KfQoKLy8gZGVmaW5pc2NvIHVuYSBmdW56aW9uZSBjaGUgcHJlbmRlIGluIGlucHV0IHVuYSBzZXF1ZW56YSBlIGNvbnRyb2xsYSBzZSBub24gY29sbGlkZSBjb24gbGUgc2VxdWVuemUgZ2nDoCBzY3JpdHRlCmJvb2wgYWNjZXB0YWJsZShpbnQgYXJyYXlbXSxpbnQqbWF0cmljZSwgaW50IGxlbmd0aCAsaW50IG5fcGVybXV0YXRpb25zKXsKCWJvb2wgYWNjZXB0ZWQ9dHJ1ZTsKCWludCBpOwoJZm9yIChpPTA7aTxuX3Blcm11dGF0aW9ucztpKyspewoJCWlmIChjb2xsaWRlcygmKG1hdHJpY2VbaSpsZW5ndGhdKSxhcnJheSxsZW5ndGgpKXsKCQkJYWNjZXB0ZWQ9ZmFsc2U7CgkJfQoJfQoJcmV0dXJuIGFjY2VwdGVkOwp9CmludCBtYWluKCl7CglpbnQgbGVuZ3RoOwoJaW50KiBhcnJheT0gKGludCopbWFsbG9jKDE1KnNpemVvZihpbnQpKTsKCWxlbmd0aD1yZWFkX2lucHV0KGFycmF5KTsKCQoJLy8gY2FsY29sbyBpbCBudW1lcm8gdG90YWxlIGRpIHBlcm11dGF6aW9uaSAobGVuZ3RoISkKCWludCB0b3RhbF9wZXJtdXRhdGlvbnM9MTsKCWludCBpLGo7Cglmb3IgKGk9MTtpPD1sZW5ndGg7aSsrKXsKCQl0b3RhbF9wZXJtdXRhdGlvbnMgKj1pOyAKCX0KCQoJLy9jcmVvIGxhIG1hdHJpY2UgY2hlIGNvbnRlcnLDoCBsZSBzZXF1ZW56ZSByaWNoaWVzdGUKCWludCogbWF0cmljZT0oaW50KiltYWxsb2MobGVuZ3RoKmxlbmd0aCpzaXplb2YoaW50KSk7IAoJCgkvL2NyZW8gbGEgc2VxdWVuemEgZGVpIG51bWVyaSBmaXNzaQoJaW50KiBmaXhlZD0gKGludCopbWFsbG9jKGxlbmd0aCpzaXplb2YoaW50KSk7Cglmb3IgKGk9MDtpPGxlbmd0aDtpKyspewoJCWZpeGVkW2ldPWk7Cgl9CgkKCS8vbGEgcHJpbWEgcmlnYSBkZWxsYSBtYXRyaWNlIMOoIGxhIHNlcXVlbnphIGRlaSBudW1lcmkgZmlzc2ksIGxhIHNlY29uZGEgw6ggbGEgc2VxdWVuemEgaW4gaW5wdXQKCWZvciAoaj0wOyBqPGxlbmd0aDtqKyspewoJCW1hdHJpY2Vbal09Zml4ZWRbal07CgkJbWF0cmljZVsxKmxlbmd0aCtqXT1hcnJheVtqXTsKCX0KCQoJCgkvL290dGVuZ28gbGEgbWF0cmljZSBjb24gbGUgc2VxdWVuemUgcmljaGllc3RlCglpbnQgbT0yOwoJZm9yKGk9MDsgaTx0b3RhbF9wZXJtdXRhdGlvbnMtMTtpKyspewoJCW5leHRfcGVybXV0YXRpb24oZml4ZWQsbGVuZ3RoKTsKCQlpZihhY2NlcHRhYmxlKGZpeGVkLG1hdHJpY2UsbGVuZ3RoLG0pKXsKCQkJZm9yKGo9MDsgajxsZW5ndGg7aisrKXsKCQkJCW1hdHJpY2VbbSpsZW5ndGgral09Zml4ZWRbal07CgkJCX0KCQkJbSsrOwoJCX0KCX0KCQoJLy9zdGFtcG8gbGEgbWF0cmljZSBjb24gbGUgc2VxdWVuemUgcmljaGllc3RlCglmb3IoaT0xOyBpPG07aSsrKXsKCQlwcmludGYoIiVkIixtYXRyaWNlW2kqbGVuZ3RoXSk7CgkJCgkJZm9yKCBqPTE7IGo8bGVuZ3RoO2orKyl7CgkJCXByaW50ZigiICVkIixtYXRyaWNlW2kqbGVuZ3RoK2pdKTsKCQl9CgkJcHJpbnRmKCJcbiIpOwoJfQoKCXJldHVybiAwOwoJCn0=