Salve a tutti, scusate se non mi presento ufficialmente al forum e scusate anche se faccio questo necroposting!
Anche io come l'utente Joy mi sono imbattuto nel programma della tombola con solo qualche differenza: non ho una traccia da seguire (il tutto è nato da una sfida con un compagnio), non ho una preparazione universitaria e in questo caso non devo generare 5 schede ma bensì una serie completa.
Per chi non sapesse di cosa si tratta una serie sono 6 schede dove compaiono tutti e 90 i numeri della tombola, in caso mi sia spiegato male eccovi la pagina di Wikipedia che sicuramente spiega meglio:
Sono a uno stato abbastanza avanzato con i lavori, riesco a soddisfare tutti i requisiti della costruzione e cioè: 5 numeri per riga, almeno un numero e massimo 2 per colonna e tutti numeri diversi, il problema è che solo alcune volte il programma soddisfa tutte le condizioni insieme riuscendo a creare la scheda, le altre volte entra in un loop infinito dove i numeri che restano non soddisfano le condizioni dei posti liberi nella matrice.
Per quanto riguarda invece l'algoritmo provo a spiegarvelo a parole a grandi linee:Comincio con generare un Array di 90 celle con dentro numeri che vanno dall'1 a 90 (serve per non inserire doppioni nella matrice), per le schede uso un'unica grande matrice di 18 righe per 9 colonne e gli "affianco" un array che tiene il conto di quanti numeri sono stati inseriti nella riga, immaginatelo così:
_____________________
|*******************************! !0! <==Array
|******************************! !0!
|******************************! |0!
|******* Matrice*************| !0!
|*****************************| !0!
|***************************** | !0!
|______________________! !0!
A questo punto parte una funzione che inserisce un numero per ogni colonna di scheda, la riga viene scelta casualmente, il risultato è questo:
Per inserire gli altri 36 numeri ne prendo uno a caso dall'Array dei 90, scelgo una riga in maniera random e se soddisfa tutte le condizioni la inserisco; il punto è come ho già scritto che non sempre gli ultimi numeri riescono a soddisfare le condizioni e quindi il programma si blocca.
Vi lascio anche il codice nonostante il mio sia un problema di algoritmo e nonostante anche non sia leggibilissimo il codice, come compilatore uso il dev c++.
#include<iostream>
#include<math.h>
#define q 100
using namespace std;
void carica_bussolotto(int numero[q],int n);
void leggi_array(int numero[q],int n);
void estrazioni(int numero[q],int &n);
void cocktail_sbagliato(int numero[q],int n);
void swap(int &a,int &b);
void leggi_matrice(int numero[q][q],int m, int n);
void carica_serie(int numero[q],int matri[q][q], int n,int rig);
void aiuto_carica(int numero[q],int matri[q][q], int &n,int array[]);
void ordina_colonna(int matri[q][q]);
bool controlla_colonna(int matri[q][q],int col,int rig);
int main ()
{
int n=90,rig=18,col=9,bussolotto[n];
int serie[q][q];;
bool ambo=false,terno=false,quaterna=false,cinquina=false,tombola=false;
srand(time(NULL));
carica_bussolotto(bussolotto,n);
carica_serie(bussolotto,serie,n,rig);
leggi_matrice(serie,rig,col);
cout<<endl;
n=90;
carica_bussolotto(bussolotto,n);
estrazioni(bussolotto,n);
system("pause");
return 0;
}
void carica_bussolotto(int numero[q],int n)
{
for(int i=0;i<n;i++)
numero[i]=i+1;
}
void leggi_array(int numero[],int n)
{
for(int i=0;i<n;i++)
cout<<numero[i]<<" ";
cout<<endl;
}
void estrazioni(int numero[q],int &n)
{
int i=0;
while(n>0)
{
i=rand() % n;
cout<<numero[i]<<endl;
swap(numero[i],numero[n-1]);
n--;
}
}
void cocktail_sbagliato(int numero[],int n)
{
int i=0,appoggio,j=1;
bool disordine;
do
{
disordine=false;
while(i<n-1)
{
if (numero[j]>numero[i])
{
appoggio=numero[i];
numero[i]=numero[j];
numero[j]=appoggio;
disordine=true;
}
i++;
j++;
}
if (disordine==true)
{
disordine=false;
while (i>0)
{
i--;
j--;
if (numero[j]>numero[i])
{
appoggio=numero[i];
numero[i]=numero[j];
numero[j]=appoggio;
disordine=true;
}
}
}
}
while (disordine==true);
}
void swap(int &a,int &b)
{
int appoggio;
appoggio=a;
a=b;
b=appoggio;
}
void carica_serie(int numero[q],int matri[q][q], int n,int rig)
{
int i=0,j=0,col=0,array[rig];
bool exit;
for(int i2=0;i2<rig;i2++)
array[i2]=5;
aiuto_carica(numero,matri,n,array);
while (n>0)
{
i=rand() % n;
j=rand() % rig;
if (array[j]>0)
{
col=numero[i]/10;
if (col>8)
col--;
if (controlla_colonna(matri,col,j)==false)
if (matri[col][j]==0)
{
matri[col][j]=numero[i];
swap(numero[i],numero[n-1]);
n--;
array[j]--;
leggi_matrice(matri,rig,9);
system("pause");
}
}
}
}
void leggi_matrice(int numero[q][q],int m, int n)
{
for(int j=0;j<m;j++)
{
if (j%3==0)
cout<<endl;
for(int i=0;i<n;i++)
{
if (numero[i][j]==0)
cout<<" ";
else
if (numero[i][j]<10)
cout<<numero[i][j]<<" ";
else
cout<<numero[i][j]<<" ";
}
cout<<endl;
}
}
void aiuto_carica(int numero[q],int matri[q][q], int &n,int array[])
{
int rig,i,col=0,k=0,j=0,c=9,p=18,m=9;
while (j<6)
{
i=rand() % 9;
if(numero[i]>0)
{
rig=rand() % 3 + k;
if (array[rig]>0)
{
matri[col][rig]=numero[i];
numero[i]=0;
j++;
k=k+3;
n--;
array[rig]--;
}
}
}
col++;
while(col<9)
{
j=0;
k=0;
while (j<6)
{
i=rand() % 10 + c;
if(numero[i]>0)
{
rig=rand() % 3 + k;
if (array[rig]>0)
{
matri[col][rig]=numero[i];
numero[i]=0;
j++;
k=k+3;
n--;
array[rig]--;
}
}
}
c=c+10;
col++;
}
leggi_matrice(matri,18,9);
system("pause");
cocktail_sbagliato(numero,90);
}
bool controlla_colonna(int matri[q][q],int col,int rig)
{
int somma, scheda;
bool errore=false;
scheda=(rig/3)*3;
somma=matri[col][scheda]+matri[col][scheda+1]+matri[col][scheda+2];
col=col*10;
if((somma-col)>=10)
errore=true;
return errore;
}
Vi lascio anche l'immagine di uno dei possibili errori, in questo caso l'ultimo numero da inserire è il 50 e l'unica riga con 4 numeri ha già il 56.
Qualsiasi suggerimento è ben accetto e grazie in anticipo!!!