tcbpg

UVa 989 - Sudoku - Accepted

Mar 22nd, 2012
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 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.         int nzr[81],nzc[81],nz=0;
  89.        
  90.         forn(i,nrows)
  91.         forn(j,ncols){
  92.             forsn(k,1,nrows+1){
  93.                 if(inRow[i][k] > 1 || inCol[j][k] > 1 || inBlock[n*(i/n)+j/n][k] > 1){
  94.                     solFound = false;
  95.                     goto found;
  96.                 }
  97.             }
  98.         }
  99.  
  100.         forn(i,z){
  101.             int r = zr[i], c = zc[i];
  102.            
  103.             int pos = 0, num=-1;
  104.             forsn(k,1,nrows+1){
  105.                 if(!inRow[r][k] && !inCol[c][k] && !inBlock[n*(r/n)+c/n][k]){
  106.                     pos++; num = k;
  107.                 }
  108.             }
  109.  
  110.             if(pos == 1){
  111.                 inRow[r][num]++; inCol[c][num]++; inBlock[n*(r/n)+c/n][num]++;
  112.                 m[r][c] = num;
  113.                 zr[i] = zc[i] = -1;
  114.             }
  115.         }
  116.         forn(i,z){
  117.             if(zr[i] >= 0 && zc[i] >= 0){
  118.                 nzr[nz] = zr[i]; nzc[nz] = zc[i]; nz++;
  119.             }
  120.         }
  121.         z = nz;
  122.         forn(i,z){
  123.             zr[i] = nzr[i]; zc[i] = nzc[i];
  124.         }
  125.        
  126.         solFound = false;
  127.         backtrack(0);
  128.  
  129. found:
  130.         if(solFound){
  131.             forn(i,nrows){
  132.                 forn(j,ncols){
  133.                     putchar(m[i][j]+'0');
  134.                     if(j < n*n-1) putchar(' ');
  135.                 }
  136.                 putchar('\n');
  137.             }
  138.         }else{
  139.             printf("NO SOLUTION\n");
  140.         }
  141.     }
  142.  
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment