Hi Guys,

I try to solve this problem:
http://br.spoj.pl/problems/BSUDO/

Using backtracking + bit representation but my solution get TLE

Some idea??

My backtracking function is here:

int linha[N]; //line
int coluna[N]; //column
int box[N];
char A[N+1][N+1];

int mask [] = {
#define B(i) 1<<i
B(0),B(1),B(2),B(3),B(4),B(5),B(6),B(7),B(8)
};
int backtrack(int i, int j) {
    int c;
    if (i == N) {
        return 1;
    }
    int in = i, jn = j+1;
    if (jn == N) {
        in++;
        jn = 0;
    }

  if (A[i][j] != '0') {
        return backtrack(in, jn);
    }

    int ii = i / 3;
  int jj = j / 3;

  c = linha[i] | coluna[j] | box[3*ii+jj];
  c = ~c;
    for (int k = 0; k < N; k++) {
if( (c&mask[k]) !=0 ){
 A[i][j] = '0'+k+1;
linha[i]     |=  mask[k];
coluna[j]    |=  mask[k];
 box[3*ii+jj] |=  mask[k];
if( backtrack(in, jn) )
return 1;
 A[i][j] = '0';
linha[i]     &=  ~mask[k];
coluna[j]    &=  ~mask[k];
 box[3*ii+jj] &=  ~mask[k];
}
    }
    return 0;
}






Wladimir Araujo Tavares
*Federal University of CearĂ¡ <http://lia.ufc.br/%7Ewladimir/>
Homepage <http://lia.ufc.br/%7Ewladimir/> |
Maratona<https://sites.google.com/site/quixadamaratona/>|
*

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to algogeeks@googlegroups.com.
To unsubscribe from this group, send email to 
algogeeks+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

#include <stdio.h>
#include <stdlib.h>
#include <map>
#define N 9

using namespace std;

int t;
int linha[N];
int coluna[N];
int box[N];
char A[N+1][N+1];

int mask [] = {
#define B(i) 1<<i
B(0),B(1),B(2),B(3),B(4),B(5),B(6),B(7),B(8)
};

//FILE *fp;
//
//
//void imprime(){
//	
//	fprintf(fp,"Tabuleiro\n");
//	for (int i = 0; i < N; i++) {
//        fprintf(fp,"%d ", A[i][0]);
//        for (int j = 1; j < N; j++) {
//            fprintf(fp,"%d ", A[i][j]);
//        }
//        fprintf(fp,"\n");
//  }
//  fprintf(fp,"-----------------------------\n");
//  
//
//}

int backtrack(int i, int j) {
    
    int c;
		
		if (i == N) {
        return 1;
    }
    int in = i, jn = j+1;
    if (jn == N) {
        in++;
        jn = 0;
    }
    
		if (A[i][j] != '0') {
        return backtrack(in, jn);
    }
    
    int ii = i / 3;
		int jj = j / 3;
    
		c = linha[i] | coluna[j] | box[3*ii+jj];
		c = ~c;
		
    for (int k = 0; k < N; k++) {
				if( (c&mask[k]) !=0 ){
					A[i][j] = '0'+k+1;
					linha[i]     |=  mask[k];
					coluna[j]    |=  mask[k];
					box[3*ii+jj] |=  mask[k]; 
					if( backtrack(in, jn) )
						return 1;
					A[i][j] = '0';
				  linha[i]     &=  ~mask[k];
					coluna[j]    &=  ~mask[k];
					box[3*ii+jj] &=  ~mask[k]; 
				}
    }
    return 0;
}



int main(){

		char str[1024];

		//fp = fopen("sudoku2.out","wt");

		int k;

		
		scanf("%d\n", &t); 
    while (t--) {
        
        for(int i=0; i < N; i++){
					linha[i] = coluna[i] = box[i] = 0;
				}
				
				for (int i = 0; i < N; i++) {
            scanf("%s",A[i]);
            for (int j = 0; j < N; j++) {		
								if(A[i][j] != '0'){
						      int k = A[i][j]-'0';
									int ii = i / 3;
									int jj = j / 3;
									linha[i]     |=  mask[k-1];
									coluna[j]    |=  mask[k-1];						
									box[3*ii+jj] |=  mask[k-1];
						    }	
            }
				}
				
				
				
				if (backtrack(0, 0)) {
            for (int i = 0; i < N; i++) {
                printf("%s\n", A[i]);
            }
        } else {
            printf("NO SOLUTION\n");
        }
        
	  }
	  //fclose(fp);
	  //system("PAUSE");
		return 0;
}

Reply via email to