int algoritmo(int nivel){ int i; for(i=letrasUsadas[2][nivel];i<10;i++){ if(valoresUsados[i]==0){ valoresUsados[i]=1; letras[letrasUsadas[0][nivel]]=i; if(letrasUsadas[1][nivel]==0){ algoritmo(nivel+1); } else{ if(verificaSolucao(letrasUsadas[1][nivel])==1){ //printf("nivel: %d nletras: %d\n",nivel,nLetras-1); if(nivel==nLetras-1){ existeSolucao=1; trataSolucao(); } else{ algoritmo(nivel+1); } } } valoresUsados[i]=0; } } return 0; }
void main(){ int tabuleiro[9][9], i, j; /* leitura */ for( i = 0; i < 9; i++) for(j = 0; j < 9; j++) scanf("%d",&(tabuleiro[i][j])); verificaSolucao((int *)tabuleiro); }
int algoritmo(int nivel){ int i; /*o for comeca na mascara de cada letra(ou seja ou em 1 ou 0 conforme essa letra tenha sido uma primeira letra de uma palavra ou nao)*/ //i= valor que se vai dar a letra desse nivel for(i=letrasUsadas[2][nivel];i<10;i++){ /*se o valor escolhido ainda nao tiver sido usado*/ if(valoresUsados[i]==0){ /*marca-se o valor como usado*/ valoresUsados[i]=1; /*a letra recebe o valor escolhido no array que contem todo o alfabeto*/ letras[letrasUsadas[0][nivel]]=i; /*se ate esta letra nao se conseguir fazer nenhum somatorio de uma coluna, entao continuar a recursao*/ if(letrasUsadas[1][nivel]==0){ algoritmo(nivel+1); } /*se ja se conseguir fazer a soma de colunas, então irei testar*/ else{ /*se se verificar o somatorio das colunas*/ if(verificaSolucao(letrasUsadas[1][nivel])==1){ /*verificar se é o ultimo nivel. como verificou todas as colunas, entao é uma solucao e vai tratar dessa solucao*/ if(nivel==nLetras-1){ existeSolucao=1; trataSolucao(); contador++; } /*se nao for o ultimo nivel(letra diferente),entao continua a recursao*/ else{ algoritmo(nivel+1); } } /*se nao verificar solucao da coluna, entao vou desmarcar(por a 0) o valor usado para esta letra e retorno 0 á recursao anterior que irá testar outro valor para este nivel*/ } valoresUsados[i]=0; } } return 0; }