我必须使用回溯来填充矩阵,并考虑到某些事情。
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;
}