|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
[C] Modificare valore all'interno di una matrice
Il codice che ho scritto è questo, dopo l'inserimento di una griglia di valori esempio
1 2 1 2 3 4 5 6 1 3 9 8 7 2 7 6 devo implementare delle tecniche per risolvere un gioco che si chiama Hitori la griglia è sempre quadrata di varie dimensioni La funzione panino imbottito implementa una tecnica che trova un valore da "non annerire" in mezzo a due numeri uguali Per non annerire intendo marcarli in qualche modo ad esempio -2- in modo da stampare in output in questo modo come faccio a marcarlo e tenere in memoria questo per poi stamparlo a video così: 1 -2- 1 2 -3- 4 5 6 1 3 9 8 7 -2- 7 6 Suggerimenti!!!! Codice:
#include <stdio.h> #include <stdlib.h> #include <ctype.h> typedef int** TMatrice; /* tipo matrice, vettore di puntatori */ /*============================ Dichiarazione delle funzioni (prototipi) ===============================*/ TMatrice alloca_matrice(int n); /* Alloca memoria per una matrice */ void libera_matrice(TMatrice *matrice, int n); /* Libera la memoria allocata */ void inserimento(TMatrice matrice, int n); void stampa_matrice (TMatrice matrice , int n); void panino_imbottitorighe(TMatrice matrice, int n); void panino_imbottitocolonne(TMatrice matrice, int n); /*=====================================================================================================*/ /*==================== MAIN ===================== */ int main() { TMatrice matrice; int n; printf("Dimensione griglia?\n"); scanf("%d" , &n); matrice = alloca_matrice(n); inserimento(matrice, n); panino_imbottitorighe(matrice,n); panino_imbottitocolonne(matrice,n); printf("\n"); stampa_matrice(matrice, n); libera_matrice(&matrice, n); return 0; } /* Alloca la memoria per una matrice di dimensione n e ne restituisce un puntatore. */ TMatrice alloca_matrice(int n) { TMatrice matrice; int i; /* alloco il vettore delle righe. Ogni elemento di questo vettore è un puntatore */ if(!(matrice = (TMatrice) malloc (n * sizeof(int *)))) { fprintf(stderr,"Errore di allocazione per la matrice\n"); return 0; } /* per ogni riga alloco le colonne */ for (i=0; i<n; i++) { if(!(matrice[i] = (int *) malloc (n * sizeof(int)))) { fprintf(stderr,"Errore di allocazione per la i-esima posizione \"%d\"\n",i); return 0; } } return matrice; } /* Libera la memoria allocata da alloca_matrice */ void libera_matrice(TMatrice *matrice, int n) { int i; for (i=0; i<n; i++) free((*matrice)[i]); free(*matrice); } /* Inserimento dei valori all'interno della matrice*/ void inserimento(TMatrice matrice, int n){ int i,j; for(i=0 ; i<n ; i++) for(j=0 ; j<n ; j++) { scanf("%d",&matrice[i][j]); } printf("\n"); } /* stampa del risultato della matrice */ /* in realtà alla fine dovrà stampare la metrice con degli zero che corrispondono alle caselle annerite*/ void stampa_matrice(TMatrice matrice, int n){ int i,j; for (i=0;i<n;i++) { for (j=0;j<n;j++) printf("%d ", matrice[i][j]); printf("\n"); } } /*===================== implementazione dell tecniche di risoluzione ================*/ /* numero non annerito = -1- */ /* numero annerito = *1* */ /* numero che non si sa ancora se annerito o no = 1 */ /* [PI] PANINO IMBOTIITO*/ void panino_imbottitorighe(TMatrice matrice, int n) { int i,j; for (i=0; i<n; i++) for(j=0; (j+2)<n; j++) if(matrice[i][j] == matrice[i][j+2]) /* controlla se i valori inseriti sono uguali sulle righe*/ printf("%s%d%s%d%s", "no (" , i , ", " , j+1,") : PI\n"); } void panino_imbottitocolonne(TMatrice matrice, int n){ int i,j; for(j=0; j<n; j++) for(i=0;(i+2)<n;i++) if(matrice[i][j] == matrice[i+2][j]) /* controlla se i valori inseriti sono uguali sulle colonne*/ printf("%s%d%s%d%s", "no (" , i+1 , ", " , j,") : PI\n"); } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per marcare hai varie tecniche: invece di creare una matrice di interi puoi creare una matrice di struct. La struct può essere composta da due interi, uno per il valore ed uno per la marcatura (0 non marcato, 1 marcato).
In alternativa può usare due matrici distinte, una per i valori ed una per le marcature. |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
la funzione non annerire che mi mette matrice.marcatura a 0 come va scritta perchè assegnandoli semplicemente il valore 0 mida segmentation fault!!!
![]() Codice:
#include <stdio.h> #include <stdlib.h> #include <ctype.h> typedef struct CELLA{ int valore; int marcatura; /* assume il valore 0=non annerito 1=annerito */ }CELLA; /*============================ Dichiarazione delle funzioni (prototipi) ===============================*/ CELLA** alloca_matrice(int n); /* Alloca memoria per una matrice */ void libera_matrice(CELLA** matrice, int n); /* Libera la memoria allocata */ void input(CELLA** matrice, int n); void stampa_matrice(CELLA** matrice , int n); void panino_imbottitorighe(CELLA** matrice, int n); void panino_imbottitocolonne(CELLA** matrice, int n); /*=====================================================================================================*/ /*==================== MAIN ===================== */ int main() { CELLA** matrice; int n; printf("Dimensione griglia?\n"); scanf("%d" , &n); matrice = alloca_matrice(n); input(matrice, n); panino_imbottitorighe(matrice,n); panino_imbottitocolonne(matrice,n); printf("\n"); stampa_matrice(matrice, n); libera_matrice(matrice, n); return 0; } /* Alloca la memoria per una matrice di struct CELLA di dimensione n e ne restituisce un puntatore. */ CELLA** alloca_matrice(int n) { CELLA **matrice; int i; /* alloco un array di n puntatori alla struttra CELLA e assegno il puntatore a una varibile matrice di tipo CELLA ** */ if(!(matrice = (CELLA **) malloc (n * sizeof(CELLA*)))) { fprintf(stderr,"Errore di allocazione per la matrice\n"); return 0; } /* per ogni elemento matrice[i] dell'array si alloca un array di n elementi di tipo CELLA il cui indirizzo viene posto in matrice[i] */ for(i=0; i<n; i++) { if(!(matrice[i] = (CELLA*) malloc (n * sizeof(CELLA)))) { fprintf(stderr,"Errore di allocazione per la i-esima posizione \"%d\"\n",i); return 0; } } return matrice; } /* Libera la memoria allocata da alloca_matrice */ void libera_matrice(CELLA** matrice, int n) { int i; for (i=0; i<n; i++) free((matrice)[i]); free(matrice); } /* Inserimento dei valori all'interno della matrice*/ void input(CELLA** matrice, int n){ int i,j; for(i=0 ; i<n ; i++) for(j=0 ; j<n ; j++) { scanf("%d",&matrice[i][j]); } printf("\n"); } /* stampa del risultato della matrice */ void stampa_matrice(CELLA** matrice, int n){ int i,j; for (i=0;i<n;i++) { for (j=0;j<n;j++) printf("%d ", matrice[i][j]); printf("\n"); } } /*===================== implementazione dell tecniche di risoluzione ================*/ /* numero non annerito = -1- */ /* numero annerito = *1* */ /* numero che non si sa ancora se annerito o no = 1 */ /* [PI] PANINO IMBOTIITO*/ void panino_imbottitorighe(CELLA** matrice, int n) { int i,j; for (i=0; i<n; i++) for(j=0; (j+2)<n; j++) if(matrice[i][j].valore == matrice[i][j+2].valore) /* controlla se ci sono valori uguali a distanza 2 sulle righe*/ printf("%s%d%s%d%s", "no (" , i , ", " , j+1,") : PI\n"); /* richiamo la funzione non annerire */ /************************************************************/ non_annerire( ); } void panino_imbottitocolonne(CELLA** matrice, int n){ int i,j; for(j=0; j<n; j++) for(i=0;(i+2)<n;i++) if(matrice[i][j].valore == matrice[i+2][j].valore) /* controlla se ci sono valori uguali a distanza 2 sulle colonne*/ printf("%s%d%s%d%s", "no (" , i+1 , ", " , j,") : PI\n"); } int non_annerire(CELLA** matrice, int n){ } |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non avevo visto che può avere tre stati. Fai così: 0 ancora da capire se va annerito o meno, 1 non annerito, 2 annerito.
E' sbagliata la funzione di lettura: Codice:
/* Inserimento dei valori all'interno della matrice*/ void input(CELLA** matrice, int n){ int i,j; for(i=0 ; i<n ; i++) for(j=0 ; j<n ; j++) { scanf("%d",&matrice[i][j].valore); matrice[i][j].marcatura = 0; } printf("\n"); } |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
Ho cambiato alcune funzioni in modo da far stampare i numeri di cui so quali annerire e quali no,il problema è che applica due regole diverse sullo stesso input:
esempio input 1 2 1 4 2 4 8 9 9 output no (0, 1) : PI si (1, 1) : SB no (1, 1) : PI questa si (0, 1) : SB e questa non dovrebbe applicarle 1 *2* 1 4 -2- 4 8 9 9 output giusto dovrebbe essere: 1 -2- 1 4 *2* 4 8 9 9 Codice:
/* Inserimento dei valori all'interno della matrice*/ void input(CELLA** matrice, int n){ int i,j; for(i=0 ; i<n ; i++) for(j=0 ; j<n ; j++) { scanf("%d",&matrice[i][j].valore); matrice[i][j].marcatura = 0; } printf("\n"); } /* stampa del risultato della matrice */ void stampa_matrice(CELLA** matrice, int n){ int i,j; for (i=0;i<n;i++) { for (j=0;j<n;j++) if (matrice[i][j].marcatura == 1) printf("%s%d%s ","-", matrice[i][j].valore, "-"); else if(matrice[i][j].marcatura == 2) printf("%s%d%s ","*", matrice[i][j].valore, "*"); else if(matrice[i][j].marcatura == 0) printf("%d ", matrice[i][j].valore); printf("\n"); } } /*===================== Implementazione dell tecniche di risoluzione ================*/ /* numero non annerito = -1- */ /* numero annerito = *1* */ /* numero che non si sa ancora se annerito o no = 1 */ /* FUnzione che oltre a colorare la cella(i,j) come annerita,applica poi ricorsivamente le regole NV e A. */ void annerisci(CELLA** matrice,int i , int j){ matrice[i][j].marcatura = 2; printf("%s%d%s%d%s", "si (" , i , ", " , j,") : SB\n"); } /* [SB] SOLO UN BIANCO */ void solo_un_bianco(CELLA** matrice, int n,int a,int b){ int i,j; for(i=0; i<n;i++) for(j=0;j<n;j++) if(!(i==a && j==b) && (i==a || j==b) && matrice[i][j].valore == matrice[a][b].valore) annerisci(matrice, i ,j); } /* Funzione che oltre a marcare la cella(i,j) come non annerita, applica poi ricorsivamente la regola SB.*/ void non_annerire (CELLA** matrice,int n,int i , int j){ matrice[i][j].marcatura = 1; printf("%s%d%s%d%s", "no (" , i , ", " , j,") : PI\n"); solo_un_bianco(matrice,n,i,j); } /* [PI] PANINO IMBOTIITO*/ void panino_imbottito(CELLA** matrice, int n) { int i,j; for (i=0; i<n; i++) for(j=0; (j+2)<n; j++) if(matrice[i][j].valore == matrice[i][j+2].valore) /* controlla se ci sono valori uguali a distanza 2 sulle righe*/ /* richiamo la funzione non_annerire */ non_annerire(matrice,n,i,j+1); for(j=0; j<n; j++) for(i=0;(i+2)<n;i++) if(matrice[i][j].valore == matrice[i+2][j].valore) /* controlla se ci sono valori uguali a distanza 2 sulle colonne*/ /* richiamo la funzione non_annerire*/ non_annerire(matrice,n,i+1,j); } |
![]() |
![]() |
![]() |
#6 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
trovato
![]() Codice:
/* [PI] PANINO IMBOTIITO*/ void panino_imbottito(CELLA** matrice, int n) { int i,j; for (i=0; i<n; i++) for(j=0; (j+2)<n; j++) if((matrice[i][j].valore == matrice[i][j+2].valore) && matrice[i][j+1].marcatura == 0) /* controlla se ci sono valori uguali a distanza 2 sulle righe*/ /* richiamo la funzione non_annerire */ non_annerire(matrice,n,i,j+1); for(j=0; j<n; j++) for(i=0;(i+2)<n;i++) if((matrice[i][j].valore == matrice[i+2][j].valore) && matrice[i+1][j].marcatura == 0) /* controlla se ci sono valori uguali a distanza 2 sulle colonne*/ /* richiamo la funzione non_annerire*/ non_annerire(matrice,n,i+1,j); } |
![]() |
![]() |
![]() |
#7 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
Ho un altro problema ho scritto questo:
Il problema è che mi ripete tante volte ricorsivamente, perchè NV chiama non_annerire che richiama a sua volta solo_un_bianco. FOrse devo mettere un controllo per vedere da dove arriva...ma come?????? ![]() Codice:
/* Funzione che oltre a marcare la cella(i,j) come non annerita, applica poi ricorsivamente la regola SB.*/ void non_annerire(CELLA** matrice,int n,int i , int j){ matrice[i][j].marcatura = 1; /* caso che vine da PI*/ printf("%s%d%s%d%s", "no (" , i , ", " , j,") : PI\n"); solo_un_bianco(matrice,n,i,j); /* caso che viene da NV*/ /*printf("%s%d%s%d%s", "no (" , i , ", " , j,") : NV\n");*/ } /* [NV] NERO VICINO */ void nero_vicino(CELLA** matrice, int n, int a , int b){ int i,j; for(i=0; i<n;i++) for(j=0;j<n;j++) if(((i==a && (j==b-1 || j==b+1)) && matrice[a][b].marcatura == 2) || ((j==b && (i==a-1 || i==b+1)) && matrice[a][b].marcatura == 2)) non_annerire(matrice,n, i ,j); } |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Puoi spostare la chiamata a solo_un_bianco nel chiamante di non_annerire. Dal punto di vista del significato dei nomi delle funzioni: perché non_annerire chiama solo_un_bianco ?
non_annerire ha un solo compito, marcare la cella come non annerita |
![]() |
![]() |
![]() |
#9 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
non_annerire deve marcare la cella come non annerita, ma per creare la ricorsione come suggerimento il compito dice :
oltre a colorare la cella(i,j) del colore opportuno, applica poi ricorsivamente le regole NV e A oppure SB richiamando rispettivamente le funzioni non_annerire o annerisci su altre caselle della griglia. allora ho inserito le due funzioni non_annerire chiama SB perchè se una casella è non annerita vado a vedere se sulla stessa riga o colonna c'è un numero uguale da annerire, se ne trova uno da annerire richiama NV per non annerire le celle vicino a quella annerita....e così via... non riesco a capire come differenziare la stampa del PI e del NV e il fatto della ricorsione non so se funziona questo è il codice con dei controlli sulla stampa della griglia: Codice:
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> typedef struct CELLA{ int valore; int marcatura; /* assume il valore 0=non si sa ancora; 1=non annerito; 2=annerito */ }CELLA; /*============================ Dichiarazione delle funzioni (prototipi) ===============================*/ CELLA** alloca_matrice(int n); /* Alloca memoria per una matrice */ void libera_matrice(CELLA** matrice, int n); /* Libera la memoria allocata */ void input(CELLA** matrice, int n); void stampa_matrice(CELLA** matrice , int n); void panino_imbottito(CELLA** matrice, int n); void solo_un_bianco(CELLA** matrice, int n,int a,int b); void non_annerire(CELLA** matrice, int n, int i, int j); void annerisci(CELLA** matrice,int n, int i, int j); void nero_vicino(CELLA** matrice,int n, int a , int b); /*=====================================================================================================*/ /*==================== MAIN ===================== */ int main() { CELLA** matrice; int n; printf("Dimensione griglia?\n"); scanf("%d" , &n); matrice = alloca_matrice(n); input(matrice, n); panino_imbottito(matrice,n); printf("\n"); stampa_matrice(matrice, n); libera_matrice(matrice, n); return 0; } /* Alloca la memoria per una matrice di struct CELLA di dimensione n e ne restituisce un puntatore. */ CELLA** alloca_matrice(int n) { CELLA **matrice; int i; /* alloco un array di n puntatori alla struttra CELLA e assegno il puntatore a una varibile matrice di tipo CELLA ** */ if(!(matrice = (CELLA **) malloc (n * sizeof(CELLA*)))) { fprintf(stderr,"Errore di allocazione per la matrice\n"); return 0; } /* per ogni elemento matrice[i] dell'array si alloca un array di n elementi di tipo CELLA il cui indirizzo viene posto in matrice[i] */ for(i=0; i<n; i++) { if(!(matrice[i] = (CELLA*) malloc (n * sizeof(CELLA)))) { fprintf(stderr,"Errore di allocazione per la i-esima posizione \"%d\"\n",i); return 0; } } return matrice; } /* Libera la memoria allocata da alloca_matrice */ void libera_matrice(CELLA** matrice, int n) { int i; for (i=0; i<n; i++) free((matrice)[i]); free(matrice); } /* Inserimento dei valori all'interno della matrice*/ void input(CELLA** matrice, int n){ int i,j; for(i=0 ; i<n ; i++) for(j=0 ; j<n ; j++) { scanf("%d",&matrice[i][j].valore); matrice[i][j].marcatura = 0; } printf("\n"); } /* stampa del risultato della matrice */ void stampa_matrice(CELLA** matrice, int n){ int i,j; for (i=0;i<n;i++) { for (j=0;j<n;j++) if (matrice[i][j].marcatura == 1) printf("%s%d%s ","-", matrice[i][j].valore, "-"); else if(matrice[i][j].marcatura == 2) printf("%s%d%s ","*", matrice[i][j].valore, "*"); else if(matrice[i][j].marcatura == 0) printf("%d ", matrice[i][j].valore); printf("\n"); } } /*===================== Implementazione dell tecniche di risoluzione ================*/ /* numero non annerito = -1- */ /* numero annerito = *1* */ /* numero che non si sa ancora se annerito o no = 1 */ /* [Pi] PANINO IMBOTIITO*/ void panino_imbottito(CELLA** matrice, int n) { int i,j; for (i=0; i<n; i++) for(j=0; (j+2)<n; j++) if((matrice[i][j].valore == matrice[i][j+2].valore) && matrice[i][j+1].marcatura == 0) /* controlla se ci sono valori uguali a distanza 2 sulle righe e il valore in mezzo non è stato ancora marcato*/ /* richiamo la funzione non_annerire */ non_annerire(matrice,n,i,j+1); for(j=0; j<n; j++) for(i=0;(i+2)<n;i++) if((matrice[i][j].valore == matrice[i+2][j].valore) && matrice[i+1][j].marcatura == 0) /* controlla se ci sono valori uguali a distanza 2 sulle colonne*/ /* richiamo la funzione non_annerire*/ non_annerire(matrice,n,i+1,j); } /* [SB] SOLO UN BIANCO */ void solo_un_bianco(CELLA** matrice, int n,int a,int b){ int i,j; for(i=0; i<n;i++) for(j=0;j<n;j++) if(matrice[i][j].marcatura == 0 && matrice[i][j].valore == matrice[a][b].valore && !(i==a && j==b) && ((i==a || j==b))) annerisci(matrice,n, i ,j); } /* Funzione che oltre a colorare la cella(i,j) come annerita,applica poi ricorsivamente le regole NV e A. */ void annerisci(CELLA** matrice,int n,int i , int j){ matrice[i][j].marcatura = 2; printf("%s%d%s%d%s", "si (" , i , ", " , j,") : SB\n"); stampa_matrice(matrice,n); printf("\n"); nero_vicino(matrice,n,i,j); } /* Funzione che oltre a marcare la cella(i,j) come non annerita, applica poi ricorsivamente la regola SB.*/ void non_annerire(CELLA** matrice,int n,int i , int j){ matrice[i][j].marcatura = 1; printf("%s%d%s%d%s", "no (" , i , ", " , j,") : PI\n"); stampa_matrice(matrice,n); printf("\n"); solo_un_bianco(matrice,n,i,j); } /* [Nv] NERO VICINO */ void nero_vicino(CELLA** matrice, int n, int a , int b){ int i,j; for(i=0; i<n;i++) for(j=0;j<n;j++) if(matrice[i][j].marcatura == 0 && matrice[a][b].marcatura == 2 && (i==a && (j==b-1 || j==b+1)) || (j==b && (i==a-1 || i==b+1))) non_annerire(matrice,n, i ,j); printf("%s%d%s%d%s", "no (" , i , ", " , j,") : NV\n"); stampa_matrice(matrice,n); printf("\n"); } |
![]() |
![]() |
![]() |
#10 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
Non capisco perchè con questo codice:
Codice:
/*===================== Implementazione dell tecniche di risoluzione ================*/ /* numero non annerito = -1- */ /* numero annerito = *1* */ /* numero che non si sa ancora se annerito o no = 1 */ /**************** [PI] PANINO IMBOTIITO *****************/ void panino_imbottito(CELLA** matrice, int n) { int i,j; for (i=0; i<n; i++) for(j=0; (j+2)<n; j++) if((matrice[i][j].valore == matrice[i][j+2].valore) && matrice[i][j+1].marcatura == 0) /* controlla se ci sono valori uguali a distanza 2 sulle righe e il valore in mezzo non è stato ancora marcato*/ /* richiamo la funzione non_annerire */ non_annerire_pi(matrice,n,i,j+1); for(j=0; j<n; j++) for(i=0;(i+2)<n;i++) if((matrice[i][j].valore == matrice[i+2][j].valore) && matrice[i+1][j].marcatura == 0) /* controlla se ci sono valori uguali a distanza 2 sulle colonne*/ /* richiamo la funzione non_annerire*/ non_annerire_pi(matrice,n,i+1,j); } /**************** [SB] SOLO UN BIANCO ****************/ void solo_un_bianco(CELLA** matrice, int n,int a,int b){ int i,j; for(i=0; i<n;i++) for(j=0;j<n;j++) if(matrice[i][j].marcatura == 0 && matrice[i][j].valore == matrice[a][b].valore && !(i==a && j==b) && (i==a || j==b)) annerisci_sb(matrice,n, i ,j); } /******************** ANNERISCI******************/ /* Funzione che oltre a colorare la cella(i,j) come annerita,applica poi ricorsivamente le regole NV e A. */ void annerisci_sb(CELLA** matrice,int n,int i , int j){ matrice[i][j].marcatura = 2; printf("%s%d%s%d%s", "si (" , i , ", " , j,") : SB\n"); stampa_matrice(matrice,n); printf("\n"); nero_vicino(matrice,n,i,j); } void annerisci_cs(CELLA** matrice,int n,int i , int j){ matrice[i][j].marcatura = 2; printf("%s%d%s%d%s", "si (" , i , ", " , j,") : CS\n"); stampa_matrice(matrice,n); printf("\n"); nero_vicino(matrice,n,i,j); } /****************** NON_ANNERIRE********************/ /* Funzione che oltre a marcare la cella(i,j) come non annerita, applica poi ricorsivamente la regola SB.*/ void non_annerire_pi(CELLA** matrice,int n,int i , int j){ matrice[i][j].marcatura = 1; /* imposto la marcatura come non annerito */ printf("%s%d%s%d%s", "no (" , i , ", " , j,") : PI\n"); stampa_matrice(matrice,n); printf("\n"); solo_un_bianco(matrice,n,i,j); } /* Funzione che oltre a marcare la cella(i,j) come non annerita, applica poi ricorsivamente la regola SB.*/ void non_annerire_nv(CELLA** matrice,int n,int i , int j){ matrice[i][j].marcatura = 1; printf("%s%d%s%d%s", "no (" , i , ", " , j,") : NV\n"); stampa_matrice(matrice,n); printf("\n"); solo_un_bianco(matrice,n,i,j); } /***************** [NV] NERO VICINO *********************/ void nero_vicino(CELLA** matrice, int n, int a , int b){ int i,j; for(i=0; i<n;i++) for(j=0;j<n;j++) if(matrice[i][j].marcatura == 0 && matrice[a][b].marcatura == 2 && ((i==a && (j==b-1 || j==b+1)) || (j==b && (i==a-1 || i==b+1)))) non_annerire_nv(matrice,n, i ,j); } /*********************** [CS] COPPIA E SINGLE ***********************/ void coppia(CELLA** matrice, int n){ int i,j,a,b; for(i=0; i<n;i++) for(j=0;j+3<n;j++) if(matrice[i][j].marcatura == 0 && (matrice[i][j].valore == matrice[i][j+1].valore)) for(a=i; a<n;a++) for(b=j+3;b<n;b++) if(matrice[a][b].valore == matrice[i][j].valore) annerisci_cs(matrice,n,a,b); } Dimensione griglia? 5 1 1 1 2 3 5 4 2 3 1 1 5 3 4 3 2 4 4 1 4 1 2 1 5 4 output è: no (0, 1) : PI giusto 1 -1- 1 2 3 5 4 2 3 1 1 5 3 4 3 2 4 4 1 4 1 2 1 5 4 si (0, 0) : SB giusto *1* -1- 1 2 3 5 4 2 3 1 1 5 3 4 3 2 4 4 1 4 1 2 1 5 4 no (1, 0) : NV giusto *1* -1- 1 2 3 -5- 4 2 3 1 1 5 3 4 3 2 4 4 1 4 1 2 1 5 4 si (0, 2) : SB giusto *1* -1- *1* 2 3 -5- 4 2 3 1 1 5 3 4 3 2 4 4 1 4 1 2 1 5 4 no (0, 3) : NV giusto *1* -1- *1* -2- 3 -5- 4 2 3 1 1 5 3 4 3 2 4 4 1 4 1 2 1 5 4 no (3, 2) : NV qui mi dovrebbe dare no (1,2) : NV..perchè ![]() *1* -1- *1* -2- 3 -5- 4 2 3 1 1 5 3 4 3 2 4 -4- 1 4 1 2 1 5 4 |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Ovviamente il discorso si estende anche alle altre funzioni. |
|
![]() |
![]() |
![]() |
#12 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
Il problema è che facendo così come mi hai suggerito, l'esecuzione mi termina dopo un passo con BUS ERROR...
Codice:
void panino_imbottito(CELLA** matrice, int n) { int i,j; for (i=0; i<n; i++) for(j=0; (j+2)<n; j++) if((matrice[i][j].valore == matrice[i][j+2].valore) && matrice[i][j+1].marcatura == 0) /* controlla se ci sono valori uguali a distanza 2 sulle righe e il valore in mezzo non è stato ancora marcato*/ /* richiamo la funzione non_annerire */ non_annerire_pi(matrice,n,i,j+1); solo_un_bianco(matrice,n,i,j); for(j=0; j<n; j++) for(i=0;(i+2)<n;i++) if((matrice[i][j].valore == matrice[i+2][j].valore) && matrice[i+1][j].marcatura == 0) /* controlla se ci sono valori uguali a distanza 2 sulle colonne*/ /* richiamo la funzione non_annerire*/ non_annerire_pi(matrice,n,i+1,j); solo_un_bianco(matrice,n,i,j); } 3 1 2 1 4 5 6 6 2 8 no (0, 1) : PI 1 -2- 1 4 5 6 6 2 8 Bus error |
![]() |
![]() |
![]() |
#13 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
perchè non funziona....avete suggerimenti!!!!
(cionci) così non riesco a venirne a capo...sarò io che sbaglio la logica, mi date una mano.. |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Lo usi un debugger ?
|
![]() |
![]() |
![]() |
#15 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
Ho provato a usare il debugger di emacs , uso Mac!!!
Se hai da consigliarmi un debugger per mac è ben accetto..visto che quello di emacs è un po incasinato!!! non c'è un modo per vedere per ogni passo cosa succede...?..... |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non sono un grande esperto di Mac. Prova Code::Blocks: http://wiki.codeblocks.org/index.php...ld_on_Mac_OS_X
|
![]() |
![]() |
![]() |
#17 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
Ho trovato un errore qui:
Codice:
void nero_vicino(CELLA** matrice, int n, int a , int b){ int i,j; for(j=0; j<n;j++) for(i=0;i<n;i++) if(matrice[i][j].marcatura == 0 && (((j==b && (i==a-1 || i==a+1))) || (i==a && (j==b-1 || j==b+1)))) non_annerire_nv(matrice,n, i ,j); } questa funzione invece dovrebbe trovare che se 2 numeri adiacenti sono uguali , allora se c'è un numero uguale a quei 2 lo annerisco, sia sulla riga che sulla colonna così mi funziona nel primo caso no (1, 4) : PI *1* -1- *1* -2- 3 -5- 4 -2- 3 -1- 1 -5- 3 -4- 3 -2- 4 4 -1- 4 1 -2- 1 5 4 si (3, 4) : CS *1* -1- *1* -2- 3 -5- 4 -2- 3 -1- 1 -5- 3 -4- 3 -2- 4 4 -1- *4* 1 -2- 1 5 4 in una successiva iterazione questo non va bene no (4, 4) : NV *1* -1- *1* -2- *3* -5- 4 -2- 3 -1- 1 -5- *3* -4- -3- -2- *4* -4- -1- *4* 1 -2- 1 5 -4- si (4, 4) : CS *1* -1- *1* -2- *3* -5- 4 -2- 3 -1- 1 -5- *3* -4- -3- -2- *4* -4- -1- *4* 1 -2- 1 5 *4* Codice:
/*********************** [CS] COPPIA E SINGLE ***********************/ void coppia(CELLA** matrice, int n){ int i,j,a,b; for(i=0; i<n; i++) for(j=0; j<(n-3); j++) if(matrice[i][j].marcatura == 0 && matrice[i][j+1].marcatura == 0 && (matrice[i][j].valore == matrice[i][j+1].valore)) /* verifico se ci sono due valori vicini uguali*/ for(a=i; a<n; a++) /* sulla riga */ for(b=(j+3); b<n; b++) /* se ci sono guardo se nella stessa riga (o colonna) su cui si trovano c'è un numero uguale */ if(matrice[i][j].valore == matrice[a][b].valore) annerisci_cs(matrice,n,a,b); } grazie |
![]() |
![]() |
![]() |
#18 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
non capisco dove sta l'errore in CS...perchè mi seleziona di nuovo la cella (4,4) che era già non annerita e l'annerisce?
![]() |
![]() |
![]() |
![]() |
#19 |
Junior Member
Iscritto dal: Jun 2009
Messaggi: 26
|
Ho trovato l'errore nella funzione CS!!!!!!!
![]() Ora mi manca da implementare 2 funzioni: [NI] Nero impossibile: assumendo che la casella sia nera e applicando ricorsivamente le tecniche NV e SB si ottiene una configurazione che non rispetta le regole,allora la casella non può essere annerita. [BI] uguale al contrario come posso implementarle??????? per vedere la componente connessa della regola [A] : non ci devono essere caselle bianche isolate. é meglio utilizzare un grafo con visita in ampiezza o qualcosa del genere????? Ho un po di dubbi su questo!!! ![]() |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sull'ultima...non ti basta esplorare le 8 caselle contigue a tutte le bianche ?
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:30.