Skip to content

Commit d10a54b

Browse files
Add files via upload
1 parent 1235ead commit d10a54b

File tree

2 files changed

+472
-0
lines changed

2 files changed

+472
-0
lines changed

risolutore_sudoku.c

+238
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <time.h>
4+
//RISOLUTORE SUDOKU
5+
6+
void azzera(int matrice[9][9]);
7+
void stampa(int matrice[9][9]);
8+
void schema(int sudoku[9][9]);
9+
void assegna(int q, int sudoku_[9][9], int copia_[9][9]);
10+
int antiriga(int i, int j, int matrice[9][9]);
11+
int anticolonna(int i, int j, int matrice[9][9]);
12+
int antiquadrato(int i, int j, int matrice[9][9]);
13+
void risolvi(int sudoku_[9][9],int copia_[9][9]);
14+
15+
main()
16+
{
17+
int sudoku[9][9], copia[9][9];
18+
int sc,quantita;
19+
20+
while(1){
21+
system("cls");
22+
printf("Scegli un'opzione:\n1. Risolvi 3x3\n2. Esci\n\n-¯ ");
23+
scanf("%d",&sc);
24+
system("cls");
25+
switch(sc){
26+
case 1:
27+
azzera(sudoku);
28+
azzera(copia);
29+
do{
30+
system("cls");
31+
printf("Inserisci la quantit… di valori da avere:\n-¯ ");
32+
scanf("%d",&quantita);
33+
}while(quantita<7 || quantita>40);
34+
assegna(quantita,sudoku,copia);
35+
system("cls");
36+
printf("\nAttendi, calcolo in corso...");
37+
risolvi(sudoku,copia);
38+
stampa(sudoku);
39+
break;
40+
41+
case 2:
42+
exit(0);
43+
break;
44+
45+
default:
46+
printf("Scelta non valida.");
47+
break;
48+
}
49+
printf("\n\n");
50+
system("pause");
51+
}
52+
}
53+
54+
void azzera(int matrice[9][9]) //crea un 9x9 di zeri
55+
{
56+
int i,j;
57+
for(i=0;i<9;i++)
58+
{
59+
for(j=0;j<9;j++)
60+
{
61+
matrice[i][j]=0;
62+
}
63+
}
64+
return;
65+
}
66+
67+
void stampa(int matrice[9][9]) //visualizza soluzione sudoku
68+
{
69+
int i,j;
70+
system("cls");
71+
printf("\n\tSoluzione del Sudoku:\n\n\tÚÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄ¿\n");
72+
for(i=0;i<9;i++)
73+
{
74+
for(j=0;j<9;j++)
75+
{
76+
if(j==0)
77+
{
78+
printf("\t³ ");
79+
}
80+
printf("%d ",matrice[i][j]);
81+
if((j+1)%3==0)
82+
{
83+
printf("³ ");
84+
}
85+
}
86+
if((i+1)%3==0 && i!=8)
87+
{
88+
printf("\n\tÃÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´\n");
89+
continue;
90+
}
91+
printf("\n");
92+
}
93+
printf("\tÀÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÙ\n");
94+
return;
95+
}
96+
97+
void schema(int sudoku[9][9]) //visualizza lo schema
98+
{
99+
int i,j;
100+
printf("\t 0 1 2 3 4 5 6 7 8\n");
101+
printf("\t ÚÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄ¿\n");
102+
for(i=0;i<9;i++)
103+
{
104+
printf("\t%d ",i);
105+
for(j=0;j<9;j++)
106+
{
107+
if(j==0)
108+
{
109+
printf("³ ");
110+
}
111+
printf("%d ",sudoku[i][j]);
112+
if((j+1)%3==0)
113+
{
114+
printf("³ ");
115+
}
116+
}
117+
if((i+1)%3==0 && i!=8)
118+
{
119+
printf("\n\t ÃÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´\n");
120+
continue;
121+
}
122+
printf("\n");
123+
}
124+
printf("\t ÀÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÙ\n");
125+
return;
126+
}
127+
128+
void assegna(int q, int sudoku_[9][9], int copia_[9][9])
129+
{
130+
int i,x,y;
131+
132+
for(i=0; i<q; i++)
133+
{
134+
system("cls");
135+
printf("Inserisci i valori noti: %d/%d\nX:riga - Y:colonna\n\n",i,q);
136+
schema(sudoku_);
137+
printf("\n\n");
138+
do{
139+
printf("Posizione(X-Y)-¯ ");
140+
scanf("%d-%d",&x,&y);
141+
}while((x<0 || x>8) || (y<0 || y>8));
142+
do{
143+
printf("Valore-¯ ");
144+
scanf("%d",&sudoku_[y][x]);
145+
}while(sudoku_[y][x]<1 || sudoku_[y][x]>9);
146+
if(copia_[y][x]!=0)
147+
{
148+
i--;
149+
}
150+
copia_[y][x]=sudoku_[y][x];
151+
}
152+
return;
153+
}
154+
155+
int antiriga(int i, int j, int matrice[9][9]) //CONTROLLO ANTI-RIPETIZIONE RIGA
156+
{
157+
int s;
158+
for(s=0; s<9; s++)
159+
{
160+
if(matrice[i][j] == matrice[i][s] && (s!=j))
161+
{
162+
return 0;
163+
}
164+
}
165+
return 1;
166+
}
167+
168+
int anticolonna(int i, int j, int matrice[9][9]) //CONTROLLO ANTI-RIPETIZIONE COLONNA
169+
{
170+
int s;
171+
for(s=0; s<9; s++)
172+
{
173+
if(matrice[i][j] == matrice[s][j] && (s!=i))
174+
{
175+
return 0;
176+
}
177+
}
178+
return 1;
179+
}
180+
181+
int antiquadrato(int i, int j, int matrice[9][9]) //CONTROLLO ANTI-QUADRATO
182+
{
183+
int s,c;
184+
if(i>=i-i%3 && i<3+i-i%3)
185+
{
186+
if(j>=j-j%3 && j<3+j-j%3)
187+
{
188+
for(s=i-i%3 ; s<3+i-i%3 ; s++)
189+
{
190+
for(c=j-j%3 ; c<3+j-j%3 ; c++)
191+
{
192+
if(matrice[i][j]==matrice[s][c] && (s!=i && c!=j))
193+
{
194+
return 0;
195+
}
196+
}
197+
}
198+
}
199+
}
200+
return 1;
201+
}
202+
203+
void risolvi(int sudoku_[9][9],int copia_[9][9]) //risolutore del sudoku
204+
{
205+
int i,j,c;
206+
int ripetizione=0;
207+
208+
srand(time(NULL));
209+
for(i=0; i<9; i++)
210+
{
211+
for(j=0; j<9; j++)
212+
{
213+
if(ripetizione>35) //CANCELLA RIGA DOPO TOT RIPETIZIONI
214+
{
215+
for(c=0;c<9;c++)
216+
{
217+
sudoku_[i][c]=copia_[i][c];
218+
}
219+
i--;
220+
ripetizione=0;
221+
}
222+
if(sudoku_[i][j]!=0)
223+
{
224+
continue;
225+
}
226+
sudoku_[i][j]=(rand() % 9)+1; //GENERAZIONE VALORE
227+
228+
if(antiriga(i,j,sudoku_)==0 || anticolonna(i,j,sudoku_)==0 || antiquadrato(i,j,sudoku_)==0) //CONTROLLO ANTI-RIPETIZIONE RIGA E COLONNA E ANTI-QUADRATO
229+
{
230+
ripetizione++;
231+
sudoku_[i][j--]=0;
232+
continue;
233+
}
234+
ripetizione=0;
235+
}
236+
}
237+
return;
238+
}

0 commit comments

Comments
 (0)