Introducing
Your new presentation assistant.
Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.
Trending searches
Who we are?
Metoda backtracking se aplică algoritmilor pentru rezolvarea următoarelor tipuri de
probleme:
Fiind date n mulţimi S1, S2, ... Sn, fiecare având un număr numar si de elemente, se cere găsirea
elementelor vectorului X =(x1, x2, ... xn) ϵ S=S1xS2x…Sn, astfel încât să fie îndeplinită o anumită
relaţie φ(x1, x2, … ,xn) între elementele sale.
~Mai multe detalii in Bila cu "Detalii Backtracking!~
Ideaa cautarii cu revenire poate fi generalizata si se poate
aplica si problemelor in care cautarea se realizeaza in plan (intr-o matrice).
In acest caz , solutia se prezinta sub forma unui tablou bidimensional.
O grilă SUDOKU este o matrice 9 x 9 care respectă următoarele proprietăţi:
1. fiecare element al matricii este un număr natural între 1 şi 9;
2. fiecare linie conţine toate numerele naturale de la 1 la 9;
3. fiecare coloană conţine toate numerele naturale de la 1 la 9;
4. fiecare dintre cele 9 submatrici de dimensiune 3 x 3, evidenţiate prin linii îngroşate în exemplul de mai jos, conţine toate numerele de la 1 la 9.
Un puzzle SUDOKU este o matrice 9 x 9 completată parţial cu numere naturale de la 1 la 9. Mai jos este un exemplu de puzzle SUDOKU. O soluţie a unui astfel de puzzle este o grilă sudoku care coincide cu puzzle-ul pe poziţiile precompletate.
Cerința
Scrieţi un program care, pentru o matrice 9 x 9 dată, reprezentând un puzzle SUDOKU, determină o soluţie a unui astfel de puzzle, după regulile de mai sus.
Date de intrare
Fișierul de intrare sudoku.in conține o matrice 9 x 9 (câte 9 elemente pe câte o linie a fişierului, fiecare element fiind separat printr-un spaţiu), reprezentând un puzzle SUDOKU, în care poziţiile necompletate au valoarea 0.
Date de ieșire
Fișierul de ieșire sudoku.out va conține o matrice 9 x 9 (câte 9 elemente pe câte o linie a fişierului, fiecare element fiind separat printr-un spaţiu), reprezentând soluţia puzzle-ului din fişierul de intrare.
Restricții și precizări
puzzle-ul din fişierul de intrare are soluţie unică, pentru toate testele
Cititi daca va intereseaza :)
#include <fstream>
using namespace std;
ifstream f("sudoku.in")
ofstream g("sudoku.out");
int a[10][10],i,j,n,k;
int st[3][100],as,ev,gast;
void succesor()
{
if(a[st[1][k]][st[2][k]]<9)
{
a[st[1][k]][st[2][k]++;
as=1;
}
else as=0;
}
void valid()
{
int i,j;
ev=1;
//parcurg linia
for(j=1;j<=9;j++)
if(j!=st[2][k]&&a[st[1][k]][j]==a[st[1][k]][st[2][k]])
ev=0;
//parcurg coloana elementului de pe nivelul k
for(i=1;i<=9;i++)
if(i!=st[1][k]&&a[i][st[2][k]]==a[st[1][k]][st[2][k]])
ev=0;
//parcurg careul corespunzator elementului a[st[1][k]][st[2][k]]
if(st[1][k]>=1&&st[1][k]<=3&&st[2][k]>=1&&st[2][k]<=3)
{
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
if(a[st[1][k]][st[2][k]]==a[i][j]&&(i!=st[1][k] j!=st[2][k]))
ev=0;
}
else
if(st[1][k]>=1&&st[1][k]<=3&&st[2][k]>=4&&st[2][k]<=6)
{
for(i=1;i<=3;i++)
for(j=4;j<=6;j++)
if(a[st[1][k]][st[2][k]]==a[i][j]&&(i!=st[1][k] j!=st[2][k]))
ev=0;
}
else
if(st[1][k]>=1&&s[1][k]<=3&&st[2][k]>=7&&st[2][k]<=9)
{
for(i=1;i<=3;i++)
for(j=7;j<=9;j++)
if(a[st[1][k]][st[2][k]]==a[i][j]&&(i!=st[1][k] j!=st[2][k]))
ev=0;
}
else
if(st[1][k]>=4&&st[1][k]<=6&&st[2][k]>=1&&st[2][k]<=3)
{
for(i=4;i<=6;i++)
for(j=1;j<=3;j++)
if(a[st[1][k]][st[2][k]]==a[i][j]&&(i!=st[1][k] j!=st[2][k]))
ev=0;
}
else
if(st[1][k]>=4&&st[1][k]<=6&&st[2][k]>=4&&st[2][k]<=6)
{
for(i=4;i<=6;i++)
for(j=4;j<=6;j++)
if(a[st[1][k]][st[2][k]]==a[i][j]&&(i!=st[1][k] j!=st[2][k]))
ev=0;
}
else
if(st[1][k]>=4&&st[1][k]<=6&&st[2][k]>=7&&st[2][k]<=9)
{
for(i=4;i<=6;i++)
for(j=7;j<=9;j++)
if(a[st[1][k]][st[2][k]]==a[i][j]&&(i!=st[1][k] j!=st[2][k]))
ev=0;
}
else
if(st[1][k]>=7&&st[1][k]<=9&&st[2][k]>=1&&st[2][k]<=3)
{
for(i=7;i<=9;i++)
for(j=1;j<=3;j++)
if(a[st[1][k]][st[2][k]]==a[i][j]&&(i!=st[1][k] j!=st[2][k]))
ev=0;
}
else
if(st[1][k]>=7&&st[1][k]<=9&&st[2][k]>=4&&st[2][k]<=6)
{
for(i=7;i<=9;i++)
for(j=4;j<=6;j++)
if(a[st[1][k]][st[2][k]]==a[i][j]&&(i!=st[1][k] j!=st[2][k]))
ev=0;
}
else
if(st[1][k]>=7&&st[1][k]<=0&&st[2][k]>=7&&st[2][k]<=9)
{
for(i=7;i<=9;i++)
for(j=7;j<=9;j++)
if(a[st[1][k]][st[2][k]]==a[i][j]&&(i!=st[1][k] j!=st[2][k]))
ev=0;
}
void tipar()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
g<<a[i][j]<<" ";
g<<endl;
}
gasit=1;
}
int main()
{
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
{
f>>a[i][j];
if(a[i][j]==0)
{
n++;
st[1][n]=i;
st[2][n]=j;
}
}
k=1;
while(k>0&&!gasit)
{
do
{
succesor();
if(as)
valid();
}
while(as&&!ev);
if(as)
if(k==n)
tipar();
else
k++;
else
{
a[st[1][k]][st[2][k]]=0;k--;
}
}
return 0;
}