Dans une même colonne tu ne peut pas avoir deux nombres
vu que 33-6-5>21.
Donc les nombres 1,2,3,4,5,6 apparaissent dans 6 colonnes différentes, par exemple dans les 6 premières quitte à permuter les colonnes et, en conséquence, la 7em colonne ne contient que des nombres
.
Avec un programme, et en commençant par la 7em colonne, on trouve rapidement qu'il n'y a que 84 répartitions possibles pour les colonnes.
Ensuite, j'y suis allé à la bourrin en regardant pour chacune des 84 répartitions toutes les façons de sommer le 1 de la première colonne avec un terme de chaque colonne (3^6=729 possibilités) et en ne retenant que les cas où la somme fait 77 (ça donne 1394 possibilités).
Et il ne reste plus qu'à faire la même chose, mais avec le deuxième terme de la première colonne et les deux termes non encore utilisés des autres colonnes (2^6=64 possibilités) pour chercher une deuxième somme égale à 77 :
- Code: Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
int TB[3][7], OK[22];
int Nb;
void Affiche(void)
{ int x,y;
Nb++; printf("%4d : ",Nb);
for(y=0;y<7;y++)
{ for(x=0;x<3;x++) printf("%3d",TB[x][y]); printf(" ;"); }
printf("\n");
}
void Test2(void)
{ int l[7],i,Temp;
for(l[1]=1;l[1]<3;l[1]++) for(l[2]=1;l[2]<3;l[2]++) for(l[3]=1;l[3]<3;l[3]++)
for(l[4]=1;l[4]<3;l[4]++) for(l[5]=1;l[5]<3;l[5]++) for(l[6]=1;l[6]<3;l[6]++)
if(TB[1][0]+TB[l[1]][1]+TB[l[2]][2]+TB[l[3]][3]+TB[l[4]][4]+TB[l[5]][5]+TB[l[6]][6]==77)
{ for(i=1;i<7;i++) { Temp=TB[1][i]; TB[1][i]=TB[l[i]][i]; TB[l[i]][i]=Temp; }
Affiche();
for(i=1;i<7;i++) { Temp=TB[1][i]; TB[1][i]=TB[l[i]][i]; TB[l[i]][i]=Temp; }
} }
void Test1(void)
{ int l[7],i,Temp;
for(l[1]=0;l[1]<3;l[1]++) for(l[2]=0;l[2]<3;l[2]++) for(l[3]=0;l[3]<3;l[3]++)
for(l[4]=0;l[4]<3;l[4]++) for(l[5]=0;l[5]<3;l[5]++) for(l[6]=0;l[6]<3;l[6]++)
if(TB[0][0]+TB[l[1]][1]+TB[l[2]][2]+TB[l[3]][3]+TB[l[4]][4]+TB[l[5]][5]+TB[l[6]][6]==77)
{ for(i=1;i<7;i++) { Temp=TB[0][i]; TB[0][i]=TB[l[i]][i]; TB[l[i]][i]=Temp; }
Test2();
for(i=1;i<7;i++) { Temp=TB[0][i]; TB[0][i]=TB[l[i]][i]; TB[l[i]][i]=Temp; }
} }
void Recur(int k)
{ int min;
if(k<6)
{ if(k<4) min=11-k; else min=7;
for(TB[1][k]=min;(TB[2][k]=32-k-TB[1][k])>TB[1][k];TB[1][k]++)
if(OK[TB[1][k]]&&OK[TB[2][k]])
{ OK[TB[1][k]]=OK[TB[2][k]]=0;
Recur(k+1);
OK[TB[1][k]]=OK[TB[2][k]]=1;
} }
else Test1();
}
int main()
{ int i;
Nb=0; for(i=1;i<=21;i++) OK[i]=1;
for(i=0;i<6;i++) TB[0][i]=i+1;
for(TB[0][6]=7;TB[0][6]<=10;TB[0][6]++)
for(TB[1][6]=TB[0][6]+1;(TB[2][6]=33-TB[1][6]-TB[0][6])>TB[1][6];TB[1][6]++)
{ OK[TB[0][6]]=OK[TB[1][6]]=OK[TB[2][6]]=0;
Recur(0);
OK[TB[0][6]]=OK[TB[1][6]]=OK[TB[2][6]]=1;
}
}
Si tu sait pas utiliser le compilateur C de ton ordi., tu peut utiliser un interpréteur en ligne, par exemple là :
https://www.onlinegdb.com/online_c_compiler