Advertisement
xerpi

Problem P76807_en: Sudoku

Dec 20th, 2014
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. void dibuixa_sudoku(const vector<vector<int> > &sudoku)
  6. {
  7.     cout << endl;
  8.     for (int i = 0; i < 9; i++) {
  9.         cout << sudoku[i][0];
  10.         for (int j = 1; j < 9; j++) {
  11.             cout << " " << sudoku[i][j];
  12.         }
  13.         cout << endl;
  14.     }
  15. }
  16.  
  17. bool legal(const vector<vector<int> > &sudoku, int f, int c, int n)
  18. {
  19.     //Mirem la fila
  20.     for (int i = 0; i < 9; i++) {
  21.         if (sudoku[i][c] == n) return false;
  22.     }
  23.     //Mirem la columna
  24.     for (int i = 0; i < 9; i++) {
  25.         if (sudoku[f][i] == n) return false;
  26.     }
  27.     //3x3
  28.     int f0 = (f/3)*3, c0 = (c/3)*3;
  29.     for (int i = f0; i < f0 + 3; i++) {
  30.         for (int j = c0; j < c0 + 3; j++) {
  31.             if (sudoku[i][j] == n) return false;
  32.         }
  33.     }
  34.     return true;
  35. }
  36.  
  37. bool resol_sudoku(vector<vector<int> > &sudoku, int f, int c)
  38. {
  39.     if (f == 9 and c == 0) {
  40.         dibuixa_sudoku(sudoku);
  41.         return true;
  42.     } else {
  43.         if (sudoku[f][c] == 0) {
  44.             for (int i = 1; i <= 9; i++) {
  45.                 if (legal(sudoku, f, c, i)) {
  46.                     sudoku[f][c] = i;
  47.                     if (c == 9-1) {
  48.                         if (resol_sudoku(sudoku, f+1, 0)) {
  49.                             return true;
  50.                         }
  51.                     } else {
  52.                         if (resol_sudoku(sudoku, f, c+1)) {
  53.                             return true;
  54.                         }
  55.                     }
  56.                     sudoku[f][c] = 0;
  57.                 }
  58.             }
  59.         } else {
  60.             if (c == 9-1) {
  61.                 if (resol_sudoku(sudoku, f+1, 0)) {
  62.                     return true;
  63.                 }
  64.             } else {
  65.                 if (resol_sudoku(sudoku, f, c+1)) {
  66.                     return true;
  67.                 }
  68.             }
  69.         }
  70.     }
  71.     return false;
  72. }
  73.  
  74. int main()
  75. {
  76.     int n;
  77.     cin >> n;
  78.     cout << n << endl;
  79.    
  80.     for (int i = 0; i < n; i++) {
  81.         //Llegir sudoku
  82.         vector<vector<int> > sudoku(9, vector<int>(9, 0));
  83.         for (int j = 0; j < 9; j++) {
  84.             for (int k = 0; k < 9; k++) {
  85.                 char c;
  86.                 cin >> c;
  87.                 if (c != '.') sudoku[j][k] = int(c - '0');
  88.             }
  89.         }
  90.         resol_sudoku(sudoku, 0, 0);
  91.     }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement