tcbpg

UVa 989 - Sudoku - Lento

Mar 22nd, 2012
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <map>
  7. #include <set>
  8. #include <cmath>
  9. #include <bitset>
  10.  
  11. using namespace std;
  12.  
  13. #define forn(i,n) for(int i=0;i<(int)(n);i++)
  14. #define forsn(i,s,n) for(int i=(int)(s);i<(int)(n);i++)
  15. #define forall(i,c) for(typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
  16. #define dforn(i,n) for(int i=((int)(n)-1);i>=0;i--)
  17. #define dforsn(i,s,n) for(int i=((int)(n)-1);i>=(int)(n);i--)
  18. #define esta(i,c) ((c).find(i) != (c).end())
  19. #define dbg(x) cerr << #x << " = " << x << endl;
  20. #define raya cerr << string(80,'=') << endl;
  21.  
  22. typedef long long tint;
  23. typedef pair<int,int> pii;
  24. typedef vector<int> vi;
  25. typedef vector< pair<int,int> > vii;
  26.  
  27. int n, nrows, ncols, m[9][9];
  28. int zr[81],zc[81],z;
  29. int inRow[9][10],inBlock[9][10],inCol[9][10];
  30.  
  31. bool solFound = false;
  32.  
  33. bool checkSudoku(){
  34.     forn(i,nrows) forsn(j,1,nrows+1)
  35.         if(inRow[i][j] != 1 || inCol[i][j] != 1 || inBlock[i][j] != 1) return false;
  36.     return true;
  37. }
  38.  
  39. void backtrack(int cz){
  40.     if(checkSudoku()){
  41.         solFound = true;
  42.     }else{
  43.         if(cz == z) return;
  44.         int nr = zr[cz], nc = zc[cz];
  45.  
  46.         forsn(i,1,n*n+1){
  47.             if(!inRow[nr][i] && !inCol[nc][i] && !inBlock[n*(nr/n)+nc/n][i]){
  48.                 m[nr][nc] = i;
  49.                 inRow[nr][i] = inCol[nc][i] = inBlock[n*(nr/n)+nc/n][i] = 1;
  50.                 backtrack(cz+1);
  51.                
  52.                 if(solFound) return;
  53.                 inRow[nr][i] = inCol[nc][i] = inBlock[n*(nr/n)+nc/n][i] = 0;
  54.             }
  55.         }
  56.        
  57.         m[nr][nc] = 0;
  58.     }
  59. }
  60.  
  61. int main(){
  62.     #ifdef JUAMPI
  63.         freopen("989.in","r",stdin);
  64.     #endif
  65.  
  66.     bool flag = true;
  67.     while(scanf("%d",&n) == 1){
  68.         if(flag) flag = false; else putchar('\n');
  69.         nrows = ncols = n*n;
  70.        
  71.         z = 0;
  72.        
  73.         memset(inRow,0,sizeof(inRow));
  74.         memset(inCol,0,sizeof(inCol));
  75.         memset(inBlock,0,sizeof(inBlock));     
  76.    
  77.         forn(i,nrows)
  78.         forn(j,ncols){
  79.             scanf("%d",&m[i][j]);
  80.             int v = m[i][j];
  81.             if(v==0){
  82.                 zr[z] = i; zc[z] = j; z++;
  83.             }else{
  84.                 inRow[i][v]++; inCol[j][v]++; inBlock[n*(i/n)+j/n][v]++;
  85.             }
  86.         }
  87.        
  88.         solFound = false;
  89.         backtrack(0);
  90.        
  91.         if(solFound){
  92.             forn(i,nrows){
  93.                 forn(j,ncols){
  94.                     putchar(m[i][j]+'0');
  95.                     if(j < n*n-1) putchar(' ');
  96.                 }
  97.                 putchar('\n');
  98.             }
  99.         }else{
  100.             printf("NO SOLUTION\n");
  101.         }
  102.     }
  103.  
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment