Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Dal richiamo di Enrico Letta alla necessità di completare il mercato unico entro il 2028 alla visione di Nokia sul ruolo dell’IA e delle reti intelligenti, il Nokia Innovation Day 2025 ha intrecciato geopolitica e tecnologia, mostrando a Vimercate come la ricerca italiana contribuisca alle sfide globali delle telecomunicazioni
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
OPPO Reno14 F 5G si propone come smartphone di fascia media con caratteristiche equilibrate. Il device monta processore Qualcomm Snapdragon 6 Gen 1, display AMOLED da 6,57 pollici a 120Hz, tripla fotocamera posteriore con sensore principale da 50MP e generosa batteria da 6000mAh con ricarica rapida a 45W. Si posiziona come alternativa accessibile nella gamma Reno14, proponendo un design curato e tutto quello che serve per un uso senza troppe preoccupazioni.
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


Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo Plaud Note Pro convince per qualità e int...
SpaceX guarda ai primi voli orbitali del...
Il prototipo del razzo spaziale riutiliz...
Blue Origin mostra uno spettacolare vide...
Roscosmos: la capsula Bion-M2 è r...
ASUS sperimenta GPU senza connettori di ...
La Cina conquisterà lo spazio ent...
Samsung ha un nuovo entry level: debutta...
Caos nei cieli europei: attacco informat...
Volkswagen ferma la produzione di ID.Buz...
Super sconti del weekend Amazon: 5 novit...
Dreame non si ferma più: tra le n...
Samsung Galaxy Buds3 FE a meno di 95€ su...
Praticamente regalate: 135€ per le Squie...
Si rinnovano i coupon nascosti di settem...
Amazon sconta i componenti: occasioni d'...
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: 01:30.


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