Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5 introduce Dynamic Multi Frame Generation e MFG 6X, permettendo fino a cinque frame generati per ogni frame renderizzato. I test su Cyberpunk 2077 e 007 First Light mostrano forti incrementi di FPS e riduzione della latenza su RTX 5090 Laptop. Migliorano fluidità, stabilità e qualità visiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-06-2009, 17:40   #1
garfa
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");
}
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2009, 18:07   #2
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2009, 23:05   #3
garfa
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){
 
}
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2009, 06:54   #4
cionci
Senior Member
 
L'Avatar di cionci
 
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");
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2009, 15:33   #5
garfa
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);
}
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2009, 16:03   #6
garfa
Junior Member
 
Iscritto dal: Jun 2009
Messaggi: 26
trovato dovrebbe essere così
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);
}
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2009, 17:14   #7
garfa
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);
}
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2009, 17:19   #8
cionci
Senior Member
 
L'Avatar di cionci
 
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
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2009, 15:48   #9
garfa
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");
}
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 00:12   #10
garfa
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);
}
E questo input:
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
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 07:01   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da cionci Guarda i messaggi
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
Ribadisco...
Ovviamente il discorso si estende anche alle altre funzioni.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 14:27   #12
garfa
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);
}
Dimensione griglia?
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
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2009, 21:08   #13
garfa
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..
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 09:15   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Lo usi un debugger ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 14:58   #15
garfa
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...?.....
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 15:26   #16
cionci
Senior Member
 
L'Avatar di cionci
 
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
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2009, 17:02   #17
garfa
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);
}
avevo scritto b+1 invece di a+1...

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);
}
ma tutto questo lavoro con le matrici come influisce sulla complessità dei calcoli?
grazie
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2009, 15:24   #18
garfa
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?
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2009, 23:49   #19
garfa
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!!!
garfa è offline   Rispondi citando il messaggio o parte di esso
Old 01-07-2009, 07:13   #20
cionci
Senior Member
 
L'Avatar di cionci
 
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 ?
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro Redmi Watch 6 in prova: lo smartwatch con ampio ...
Spotify guarda la futuro: concerti in di...
realme GT8 Pro 12GB/256GB a 719€: è un t...
NEURA Robotics raccoglie un sacco di sol...
ASUS ROG porta in Italia i nuovi auricol...
RISC-V guarda ai datacenter: NextSilicon...
La NASA spiega perché non ci sono...
La NASA sta provando il Divergent Deploy...
Fidanzarsi con l'IA non è cos&igr...
AI Overviews: quando il riassunto &egrav...
Il circuito segreto di Apple finisce a W...
Disastro Meta: l'azienda elimina il rico...
Google Gemini non va: centinaia di segna...
Neural Dawn mostra il futuro del gaming ...
Telegram torna su Apple Watch con un'app...
Da oggi si può acquistare Amazon ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:56.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v