Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int grila[9][9], poz_nule, sol_valid;
- struct{
- int lin, col;
- }pozitii[81];
- /// functii de verificare a liniilor/coloanelor/submatricilor;
- int linie_valida(int lin){
- for(int i = 0; i<8; i++){
- for(int j = i + 1; j<9; j++){
- if(grila[lin][i]==grila[lin][j] && grila[lin][i]!=0 && grila[lin][j]!=0) return 0;
- }
- }
- return 1;
- }
- int coloana_valida(int col){
- for(int i = 0; i<8; i++){
- for(int j = i+1; j<9; j++){
- if(grila[i][col]==grila[j][col] && grila[i][col]!=0 && grila[j][col]!=0) return 0;
- }
- }
- return 1;
- }
- int submat_valida(int lin, int col){
- int vals[9], ord = 0;
- for(int i = lin; i<lin+3; i++){
- for(int j = col; j<col+3; j++){
- if(grila[i][j]) vals[ord++] = grila[i][j];
- }
- }
- for(int i = 0; i<ord-1; i++){
- for(int j = i+1; j<ord; j++){
- if(vals[i]==vals[j] && vals[i]!=0 && vals[j]!=0) return 0;
- }
- }
- return 1;
- }
- void back(int pos){
- for(int val = 1; val<=9 && !sol_valid; val++){
- grila[pozitii[pos].lin][pozitii[pos].col] = val;
- if(linie_valida(pozitii[pos].lin) && coloana_valida(pozitii[pos].col) && submat_valida(pozitii[pos].lin/3*3, pozitii[pos].col/3*3))
- if(pos+1==poz_nule) sol_valid = 1;
- else back(pos + 1);
- if(!sol_valid){
- grila[pozitii[pos].lin][pozitii[pos].col] = 0;
- }
- }
- }
- void afis(){
- for(int i = 0; i<9; i++){
- for(int j = 0; j<9; j++) {
- printf("%d ", grila[i][j]);
- }
- printf("\n");
- }
- }
- int main(){
- freopen("sudoku.in", "r", stdin);
- freopen("sudoku.out", "w", stdout);
- for(int i = 0; i<9; i++){
- for(int j = 0; j<9; j++) {
- scanf("%d", &grila[i][j]);
- if(grila[i][j]==0){
- pozitii[poz_nule].lin = i;
- pozitii[poz_nule++].col = j;
- }
- }
- }
- back(0);
- // i am retarded
- afis();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement