C - 带回溯的填充矩阵

时间:2014-10-01 00:16:29

标签: c matrix stack backtracking

我必须使用回溯来填充矩阵,并考虑到某些事情。

1 - 矩阵已经从一些用.txt文档写的数字开始  2 - 下一个数字必须接近当前数字。例如...... 2必须在1邻域。  3 - 我必须使用回溯

到目前为止,我设法填写矩阵的一部分。问题是当我想要一个我已经拥有的数字时。就像...如果我想放一个6但矩阵已经有一个6.我试图解决这个问题,但我认为这是我需要使用回溯的时候,问题是我不知道究竟是怎么回事。我尝试过很多东西,但没有!我知道为什么最后一个数字在重复,但我不知道如何回溯。 我也在使用Stack

这是示例中的原始矩阵:

0  0  0  0  0  0  0  0  0

0 81 76 75 72 65 62 61  0

0  6  0  0  0  0  0 56  0

0  1  0  0  0  0  0 55  0

0 10  0  0  0  0  0 50  0

0 13  0  0  0  0  0 51  0

0 20  0  0  0  0  0 44  0

0 19 22 27 26 35 38 39  0

0  0  0  0  0  0  0  0  0

它是9x9矩阵,其中0表示空白空间。在.txt文档中,开头有一个“9”来表示矩阵大小。

到目前为止,这是代码:

#include <stdlib.h>
#include<stdio.h>

typedef struct lis{
    int info, x, y;
    struct lis *prox;
}Lis;

typedef struct pil{
    Lis *prim;
}Pil;

Pil* cria_vazia(){
    Pil *p = (Pil*)malloc(sizeof(Pil));
    p->prim = NULL;
    return p;
}
int pilha_vazia (Pil *p){
    return(p->prim == NULL);

}


void *push (Pil *p, int v, int x, int y){
    Lis *n = (Lis*)malloc(sizeof(Lis));
    n->info=v;
    n->x = x;
    n->y=y;
    n->prox= p->prim;
    p->prim=n;
}

float *pop (Pil *p) {
    Lis *t;
    int v;
    if(pilha_vazia(p)){
        printf("\n Pilha vazia\n");
        exit(1);
    }
    t=p->prim;
    v=t->info;
    p->prim = t->prox;
    free(t);
}

void libera(Pil *p){
    Lis *q = p->prim;
    while (q!=NULL){
        Lis *t = q->prox;
        free(q);
        q =t ;

    }
free(p);
}

void pilha_imprime (Pil *p){

    Lis *q;
    for (q=p->prim;q!=NULL;q=q->prox){
        printf( "%d (%d)(%d)/", q->info, q->x, q->y);
    }
}   


int pega_tamanho (FILE *fp){
    int N;

    fseek(fp, 0, SEEK_SET);
    fscanf (fp, "%d", &N);
return N;
}


int checa_numero_igual (int N, int (*matriz)[N], int num){
    int i , j;
    for (i=0; i<N; i++){
        for (j=0; j<N; j++){

          if(matriz[i][j] == num){
               return 1;

          }
        }
    }

return 0;
}


int traca_caminho (int N, int (*matriz)[N], Pil *p){
    int i,j, x, y, num;

    num = p->prim->info;
    x = p->prim->x;
    y = p->prim->y;
    num = num+1;

   /* for (i=0; i<N; i++){
        for (j=0; j<N; j++){

          if(matriz[i][j] == num){
               return traca_caminho(N, matriz, i, j, num);

          }
        }
    }*/

    if (num >= N*N +1){
        return 0;
    }
    for (i=x-1; i<=x+1; i++){
        for (j=y-1; j<=y+1; j++){

            if (i>=0 && i<N && j>=0 && j<N){
                 //printf("\n indices: i %d, j %d, num: %d\n", i,j,num);
                if (matriz[i][j]!=0){
                       // printf("\n aqui tem=%d", matriz[i][j]);
                        //printf("\n aqui %d", num);
                    /*if(matriz[i][j]==num-1){
                        printf("\n aqui fail %d", num);
                        return 1;
                    }*/
                    //printf("\n dif");
                       // pilha_imprime(p);
//printf("\n\n\n");
                    if (matriz[i][j]==num){
                        //cria(num, cria_vazia(), cria_vazia());
                        push(p, num, i, j);
                        //printf("\n igual");
                        //pilha_imprime(p);
       // printf("\n\n\n");
       //                 printf("\n exis: %d ", num);
                        return traca_caminho(N, matriz, p);
                        //pop(p);
                        //printf("\n ok perto");
                    }
                }

            }
        }
    }
    int result;
    result= checa_numero_igual(N,matriz, num);
    if (result == 1){
        //matriz[x][y]=0;
        printf("/%d , %d/", x, y);
        pop(p);
        matriz[x][y]=0;
        //printf("\n dentro do checa");
        //pilha_imprime(p);
        //printf("\n\n\n");
        num = p->prim->info;
        x = p->prim->x;
        y = p->prim->y;
        //printf("\n fim checa");
        //pilha_imprime(p);
        //num = num+1;

    }

    for (i=x-1; i<=x+1; i++){
        for (j=y-1; j<=y+1; j++){
            if (i>=0 && i<N && j>=0 && j<N){
            if(matriz[i][j]==0){
                //cria(num, cria_vazia(), cria_vazia());
                matriz[i][j]=num;
                push(p, num, i, j);
                //printf("\n acres: %d ", num);
                return traca_caminho(N, matriz, p);
                //pop(p);
                //matriz[i][j]=0;
                //printf("\n finding %d", num);
            }
            }

        }
    }

pilha_imprime(p);
return 1;
}

int main(){
    int N, i, j, menor = 100, posii, posij, result;
    FILE* fp = fopen ("solucaoProj3.txt", "r+");
    N=pega_tamanho(fp);
    if (N<6 || N>10){
        printf("\n Erro, tamanho invalido de matriz. N deve ser: 6<=N<=10");
        exit(1);
    }
    int matriz[N][N];
    printf("\n %d", N);


    for (i=0; i<N; i++){
            for (j=0; j<N; j++){ /* TENTAR TRANSFORMAR ISSO EM FUNÇÃO*/
                    if (feof(fp)){
                    break;
                    }
                fscanf(fp,"%d", &matriz[i][j]);
                if (feof(fp)){
                    break;
                    }
            }
        }
    for (i=0; i<N; i++){
            for (j=0; j<N; j++){
                   /*if (matriz[i][j]<menor && matriz[i][j]!=0 ){
                        menor = matriz[i][j];
                        posii = i;
                        posij = j;
                    }*/
                    if(matriz[i][j]==1 /*|| matriz[i][j]==(N*N)*/){ /* começando de 1, numero aumenta. começando de N*N , numeros diminuem. cuidado*/
                        posii = i;
                        posij = j;
                        break;
                    }
            }
    }

    Pil *p = cria_vazia();
    push(p, matriz[posii][posij], posii, posij);
    pilha_imprime(p);


    /*for(i = 0; i < N; i++){
        for(j = 0; j < N; j++){
            matriz[i][j] = 0;
        }
    }

*/
    printf("\n============================\n"); /* TENTAR TRANSFORMAR ISSO EM FUNÇÃO*/
    for(i = 0; i < N; i++){
        for(j = 0; j < N; j++){
            if(matriz[i][j] > N)printf("|%d", matriz[i][j]);
            else if(matriz[i][j] == 0)printf("|  ");
            else printf("| %d", matriz[i][j]);

        }
        printf("|\n============================\n");
    }
    result = traca_caminho(N, matriz,p);
//pilha_imprime(p);
    printf("\n============================\n"); /* TENTAR TRANSFORMAR ISSO EM FUNÇÃO*/
    for(i = 0; i < N; i++){
        for(j = 0; j < N; j++){
            if(matriz[i][j] > N)printf("|%d", matriz[i][j]);
            else if(matriz[i][j] == 0)printf("|  ");
            else printf("| %d", matriz[i][j]);

        }
        printf("|\n============================\n");
    }
    printf("\n %d", result);
   fclose(fp);
   libera(p);
   return 0;
}

0 个答案:

没有答案