Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- int posb = 1
- int t[6][6],a[8] = {2, 1, -1, -2, -2, -1, 1 ,2}, b[8] = {1, 2, 2, 1, -1, -2,-2 -1};
- void imprime(int n, int p){
- int i,j;
- for(i=0;i<n;i++){
- for(j=0;j<n;j++){
- printf("%3d",t[i][j]);}
- printf("\n");
- }
- printf("\n%d movimentos ate retornar", p);
- }
- int cavalo(int i, int x, int y, int n, int p){ // c e p sao contadores de possibilidades
- int u,v,k,q, c = 0;
- if(i==n*n+1){ imprime(n,p); return 1;}
- for(k=0;k<8;k++){
- u = x + a[k]; v = y + b[k];
- if( (u>=0 && u<=n-1) && (v>=0 && v<=n-1)){
- if(t[u][v]==0 && posb == 1){
- c++;}}} p *= c; //Calcula possibilidades
- if(i==n*n+1){ imprime(n,p); return 1;}
- //executa movimentos
- for(k=0;k<8;k++){
- u = x + a[k]; v = y + b[k];
- //testa limites do tabuleiro
- if( (u>=0 && u<=n-1) && (v>=0 && v<=n-1)){
- if(t[u][v]==0){ //posicao livre
- t[u][v]=i; //registre o movimento
- q = cavalo(i+1,u,v,n,p);
- if(q==0) {t[u][v]=0; int posb = 0;}//se não alcançou todos, desfaça. Ai que o contador de possibilidades eh interrompido.
- else return 1; // se alcançou todos, retorne 1
- }
- }
- }
- return 0;
- }
- int main(){
- int n;
- printf("Insira a dimensao do tabuleiro: "); scanf("%d", &n);
- if(n < 4 || n > 6){
- printf("Valor invalido. Deve ser um numero de 4 a 6. Digite novamente:");
- scanf("%d", &n);
- }
- printf("Nao existem solucoes para os pares ");
- int cont;
- int c, d, e, f, i;
- memset(t,0,sizeof(t));
- cont =1;
- for(i = 1; i < n*n-1; i++){
- for(c = 0; c < n; c++){
- for(d = 0; d < n; d++){
- t[c][d]=0; //resetar matriz
- }
- }
- printf("\nComecando da casa %d\n", i);
- if(i%n == 0){
- e = i/n - 1; f = n-1;
- }
- else {
- e = i/n; f = i%n - 1;
- } //associa a casa a posicao da matriz
- t[e][f]=1;
- posb = 1;//reseta contador de possibilidades
- cavalo(2,e,f,n,1);
- }
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement